上次pro js读书笔记里面,我说有段代码书里面有错,可是自己不知道怎么改,偶然的机会在g9 老大的blog上看到了解决方法。
http://blog.csdn.net/g9yuayon/archive/2007/04/18/1568980.aspx
错误代码:
function User( properties ) {
var temp=this;
for ( var i in properties ) { (function(){
temp[ "get" + i ] = function() {
return properties[i];
};
temp[ "set" + i ] = function(val) {
properties[i] = val;
};
})(); }
}
var user = new User({
name: "Bob",
age: 44
});
alert( user.getname() );
alert( user.getage());
此时的结果将会打印出两个44,有关这点g9的blog上这样的解答:
引用
JavaScript的Closure环境由静态的句法结构确定。也就是说,代码一旦写成,我们就知道函数的自由变量同哪些环境里的变量绑定。因此,虽然运行时同一个内函数被调用多次,创建了多个闭包,这些闭包指向的都是同一个环境里的同一个变量。这样同JavaScript规定的闭包语义一致。
这句不是很理解,望那个达人能够解释一下.
于是我们进行改进我们可以加进去一个叫做factor function的东东。
请看改写后的代码.
function User( properties ) {
var temp=this;
for ( var i in properties ) {
(function(i){
temp[ "get" + i ] = function() {
return properties[i];
};
temp[ "set" + i ] = function(val) {
properties[i] = val;
};
})(i);
}
}
var user = new User({
name: "Bob",
age: 44
});
alert( user.getname());
user.setname("bobo");
alert(user.getname());
alert( user.getage());
这样就可以打印出正确的结果了.
分享到:
相关推荐
理解闭包是JavaScript开发者必备的技能,因为它在解决各种问题时都起着关键作用,比如延迟执行、缓存、数据隐藏等。然而,不当使用闭包也可能导致内存泄漏,因此需要谨慎使用。在面试中,闭包是一个常见的考点,理解...
对于`useEffect`中的闭包问题,我们可以采用多种策略来解决,其中最推荐的做法是使用`useRef`来保存状态的最新值,这样既可以避免不必要的重渲染,又能确保事件处理函数中使用的是最新的状态值。同时,了解闭包的...
理解并掌握JavaScript闭包是成为专业前端开发者的关键一步。在实际开发中,合理利用闭包可以提高代码的复用性和可维护性,同时也能避免一些常见的编程陷阱。通过深入学习和实践,可以更好地运用闭包这一强大的工具来...
学习和掌握闭包对于提升JavaScript编程技能至关重要,因为它是理解和解决许多高级问题的关键。通过观看"Web-前端教程36 JS进阶:闭包.mp4",开发者能够更深入地了解闭包的机制,从而更好地利用这一工具来编写更高效...
本文将对JavaScript for循环和闭包进行浅谈,并提供六种解决方案来解决for循环中的闭包问题。 首先,让我们来看一个例子。我们有一个HTML文件,其中包含五个段落,每个段落都是一个p元素。我们想实现的是,每当点击...
JavaScript 闭包是一种强大的编程工具,常常被用来解决特定的问题和优化代码结构。在JavaScript中,闭包是指一个函数能够访问并操作其定义时的作用域内的变量,即使该函数在其外部作用域被调用。以下将详细介绍两个...
也就是说, 一方面, JS 有了闭包能更好解决一些问题. 另一方面, JS 为了解决某些问题, 而不得不使用闭包勉强来解决问题. 前者这里不讨论, 如果 JS 闭包能更好的解决问题, 当然使用闭包更好. 我讨论的是后者, 是因为 ...
总结来说,“layer.rar”提供的是一种使用JavaScript闭包封装的跨平台提示模态框解决方案,它结合了HTML和CSS的威力,实现了响应式设计,可以在各种设备上提供一致的用户体验。这个工具的使用和实现涉及到了...
在JavaScript编程中,闭包是一个非常重要的概念,它的特性使得函数可以访问到外部函数作用域中的变量。然而,闭包如果使用不当,非常容易引起...通过以上措施,可以最大限度地减少JavaScript闭包所带来的内存泄漏问题。
作者:虫哥写代码,来自原文地址 看到标题“闭包”很多人会觉得懵逼包括我在内,之前对闭包有所听闻但始终无法准确全面的了解。...引入闭包解决方案;升华闭包概念理解。废话少说直接步入正题。 还原
总结来说,解决JavaScript中的闭包问题通常需要理解作用域和变量生命周期。当在循环中使用闭包时,要确保每个闭包有自己的变量副本,而不是共享同一个变量。通过使用IIFE或者将变量绑定到`this`或`let`关键字声明的...
通过这些方法,我们可以确保每个事件处理函数都能够正确地访问到循环中的变量,从而解决闭包问题。了解并熟练掌握闭包和动态事件绑定是JavaScript开发者必备的技能,这对于编写高效、无bug的代码至关重要。在实际...
理解这些基础知识不仅有助于避免常见的内存泄漏问题,还能让我们更高效地利用闭包来解决实际开发中的问题。希望本文能够帮助你建立起对闭包的深刻认识,使其成为你编程工具箱中得心应手的一部分。
第二个例子通过立即执行函数表达式(IIFE)来解决这一问题,确保每个函数闭包都能正确地访问到各自的循环变量。 闭包是JavaScript编程中的一个重要特性,它提供了创建私有变量、管理作用域和记忆化等强大功能,使得...
为了解决这个问题,可以利用闭包创建独立的变量副本: ```javascript function box() { var arr = []; for (var i = 0; i ; i++) { arr.push((function(value) { return function() { return value; }; })(i...
本文将通过几个示例探讨如何解决JavaScript函数闭包导致的内存泄露问题。 首先,我们来看一个简单的例子: ```javascript function Cars() { this.name = "Benz"; this.color = ["white", "black"]; } Cars....
在文档"js常见问题集.docx"中,提到了一些常见的JS问题及其解决方案,我们将详细探讨这些话题,并进一步扩展相关的JavaScript知识。 1. **常数未赋初值** 在ES6中,`const`用于声明不可变的常量。如果忘记在声明时...
### JavaScript闭包高级教程 #### 简介 在JavaScript编程中,“闭包”是一个非常重要的概念,尤其对于希望深入理解和高效使用JavaScript的开发者来说。简单地说,闭包是一种能够记住并访问其创建时周围环境的函数...
这份“1000个JavaScript面试问题列表”旨在帮助开发者全面了解JavaScript的知识体系,提高面试准备的效率。让我们深入探讨一下JavaScript的一些关键知识点。 1. **基础概念** - JavaScript与Java的关系:两者由...