`
simohayha
  • 浏览: 1395856 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

诡异的js闭包问题的解决.

阅读更多
上次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());  


这样就可以打印出正确的结果了.
分享到:
评论
7 楼 yeuego 2013-09-06  
匿名函数,是独立运行,如果不是全局或传参方式,函数里是无法获取到值的。


6 楼 yeuego 2013-09-06  
我很少像你们这样写

一般我是这样写的

function User( properties ) {var temp=this;for ( var i in properties )eval("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());  



5 楼 jindw 2008-08-13  
你要先知道一个让很多人服略的情况。
javascript只有函数变量,没有块变量。

你的闭包外共享的是同一个函数变量。
4 楼 dennis_zane 2007-09-20  
这里应该是创建的两个闭包共享自由变量i
3 楼 咖啡豆子 2007-09-09  
我觉得闭包里绑定的是变量而不是变量的值,所以第一次这样写以后:
# temp[ "get" + i ] = function() {    
#             return properties[i];    
#         };
并没有将properties["name"]绑定给this.getname.
第二次绑定this.getage的时候是同样道理,i最后的值是"age",所以两个getter在使用的时候都是properties["age"],好象i不会被垃圾收集,因为它被闭包使用了.不知道我的理解对不对?
2 楼 Lich_Ray 2007-09-05  
引用
这句不是很理解,望那个达人能够解释一下.

已经没法儿解释了,除非你不知道闭包变量是什么。
1 楼 笨笨狗 2007-09-05  
这是因为在外层闭包里面又生成了个闭包,然后是通过参数传递变量进去的,其实这么写更容易理解:
function User( properties ) {     
	var temp=this;     
	for ( var i in properties ) {   
		(function(j){     
			temp[ "get" + j ] = function() {     
				return properties[j];     
			};     
			temp[ "set" + j ] = function(val) {     
				properties[j] = val;     
			};     
		})(i);   
	}  
}  

相关推荐

    关于JS中的闭包浅谈.docx

    理解闭包是JavaScript开发者必备的技能,因为它在解决各种问题时都起着关键作用,比如延迟执行、缓存、数据隐藏等。然而,不当使用闭包也可能导致内存泄漏,因此需要谨慎使用。在面试中,闭包是一个常见的考点,理解...

    【JavaScript源代码】浅谈react useEffect闭包的坑.docx

    对于`useEffect`中的闭包问题,我们可以采用多种策略来解决,其中最推荐的做法是使用`useRef`来保存状态的最新值,这样既可以避免不必要的重渲染,又能确保事件处理函数中使用的是最新的状态值。同时,了解闭包的...

    JavaScript闭包(closure).pdf

    理解并掌握JavaScript闭包是成为专业前端开发者的关键一步。在实际开发中,合理利用闭包可以提高代码的复用性和可维护性,同时也能避免一些常见的编程陷阱。通过深入学习和实践,可以更好地运用闭包这一强大的工具来...

    Web-前端教程36 JS进阶:闭包.zip

    学习和掌握闭包对于提升JavaScript编程技能至关重要,因为它是理解和解决许多高级问题的关键。通过观看"Web-前端教程36 JS进阶:闭包.mp4",开发者能够更深入地了解闭包的机制,从而更好地利用这一工具来编写更高效...

    浅谈JavaScript for循环 闭包_.docx

    本文将对JavaScript for循环和闭包进行浅谈,并提供六种解决方案来解决for循环中的闭包问题。 首先,让我们来看一个例子。我们有一个HTML文件,其中包含五个段落,每个段落都是一个p元素。我们想实现的是,每当点击...

    JS闭包可被利用的常见场景

    JavaScript 闭包是一种强大的编程工具,常常被用来解决特定的问题和优化代码结构。在JavaScript中,闭包是指一个函数能够访问并操作其定义时的作用域内的变量,即使该函数在其外部作用域被调用。以下将详细介绍两个...

    JavaScript中消除闭包的一般方法介绍

    也就是说, 一方面, JS 有了闭包能更好解决一些问题. 另一方面, JS 为了解决某些问题, 而不得不使用闭包勉强来解决问题. 前者这里不讨论, 如果 JS 闭包能更好的解决问题, 当然使用闭包更好. 我讨论的是后者, 是因为 ...

    layer.rar 使用js 闭包封装的原生提示模态框

    总结来说,“layer.rar”提供的是一种使用JavaScript闭包封装的跨平台提示模态框解决方案,它结合了HTML和CSS的威力,实现了响应式设计,可以在各种设备上提供一致的用户体验。这个工具的使用和实现涉及到了...

    浅谈js 闭包引起的内存泄露问题

    在JavaScript编程中,闭包是一个非常重要的概念,它的特性使得函数可以访问到外部函数作用域中的变量。然而,闭包如果使用不当,非常容易引起...通过以上措施,可以最大限度地减少JavaScript闭包所带来的内存泄漏问题。

    微信小程序闭包问题引发的JS闭包解决方案

    作者:虫哥写代码,来自原文地址 看到标题“闭包”很多人会觉得懵逼包括我在内,之前对闭包有所听闻但始终无法准确全面的了解。...引入闭包解决方案;升华闭包概念理解。废话少说直接步入正题。   还原

    javascript 常见的闭包问题的解决办法

    总结来说,解决JavaScript中的闭包问题通常需要理解作用域和变量生命周期。当在循环中使用闭包时,要确保每个闭包有自己的变量副本,而不是共享同一个变量。通过使用IIFE或者将变量绑定到`this`或`let`关键字声明的...

    动态循环给onclick赋值(解决闭包问题)

    通过这些方法,我们可以确保每个事件处理函数都能够正确地访问到循环中的变量,从而解决闭包问题。了解并熟练掌握闭包和动态事件绑定是JavaScript开发者必备的技能,这对于编写高效、无bug的代码至关重要。在实际...

    【JavaScript源代码】详细聊聊浏览器是如何看闭包的.docx

    理解这些基础知识不仅有助于避免常见的内存泄漏问题,还能让我们更高效地利用闭包来解决实际开发中的问题。希望本文能够帮助你建立起对闭包的深刻认识,使其成为你编程工具箱中得心应手的一部分。

    基于javascript 闭包基础分享

    第二个例子通过立即执行函数表达式(IIFE)来解决这一问题,确保每个函数闭包都能正确地访问到各自的循环变量。 闭包是JavaScript编程中的一个重要特性,它提供了创建私有变量、管理作用域和记忆化等强大功能,使得...

    js闭包实例汇总

    为了解决这个问题,可以利用闭包创建独立的变量副本: ```javascript function box() { var arr = []; for (var i = 0; i ; i++) { arr.push((function(value) { return function() { return value; }; })(i...

    解决js函数闭包内存泄露问题的办法

    本文将通过几个示例探讨如何解决JavaScript函数闭包导致的内存泄露问题。 首先,我们来看一个简单的例子: ```javascript function Cars() { this.name = "Benz"; this.color = ["white", "black"]; } Cars....

    js常见问题集.docx

    在文档"js常见问题集.docx"中,提到了一些常见的JS问题及其解决方案,我们将详细探讨这些话题,并进一步扩展相关的JavaScript知识。 1. **常数未赋初值** 在ES6中,`const`用于声明不可变的常量。如果忘记在声明时...

    javascript闭包高级教程

    ### JavaScript闭包高级教程 #### 简介 在JavaScript编程中,“闭包”是一个非常重要的概念,尤其对于希望深入理解和高效使用JavaScript的开发者来说。简单地说,闭包是一种能够记住并访问其创建时周围环境的函数...

    1000个JavaScript面试问题列表.zip

    这份“1000个JavaScript面试问题列表”旨在帮助开发者全面了解JavaScript的知识体系,提高面试准备的效率。让我们深入探讨一下JavaScript的一些关键知识点。 1. **基础概念** - JavaScript与Java的关系:两者由...

Global site tag (gtag.js) - Google Analytics