当前位置:  开发笔记 > 编程语言 > 正文

JavaScript范围和闭包

如何解决《JavaScript范围和闭包》经验,为你挑选了2个好方法。

我正试图把我的脑袋包裹起来(那里有一个笑话)我跑过去:

(function () { /* do cool stuff */ })();

这是如何运作的?将功能放入parens的目的是什么?之后为什么空荡荡的?



1> Jesse Rusak..:

这一点是,在酷的东西中声明的任何变量都不会在全局命名空间中创建.javascript中的任何函数都将创建这样的范围.假设您有一些想要运行的JavaScript.如果你这样做:

var b = 1; 
// stuff using b

而其他一些代码使用b,它会让你的剩余价值.(或者,更糟糕的是,如果某些其他代码在代码运行之前设置了b,那么稍后尝试获取其旧值,那么在此期间您已经更改了它.)

另一方面,如果你有这个代码,它声明然后调用一个函数:

function a() { 
     var b = 1;
}

a();

稍后一些其他代码使用b,它将看不到您的值,因为b是函数的本地代码.当然,问题在于你仍然在创建一个全局名称 - 在这种情况下是"a".所以,我们想要一个没有名字的函数 - 这就是你得到你描述的代码的原因.它声明了一个没有名称的函数,然后调用它.

不幸的是,你不能只说:

function() { ... }()

因为这将被解析为函数声明语句,然后是语法错误.通过将函数声明包装在括号中,您将获得一个函数表达式,然后可以调用该表达式.您可以像使用第二组parens一样将其称为任何其他函数表达式(如上图所示).例如,如果函数接受了参数,那么你将它们传递给那里:

(function(a) { ... })(1)



2> Matthew Mars..:

这会创建一个函数,调用它并丢弃它.

如果你这样看它可能会更清楚:

var throwaway = function(){
    // do cool stuff
};
throwaway();

这样做是为了创建一个私有命名空间.函数中的代码可以包含函数和变量,而不必担心与页面中加载的其他代码冲突.


当然,除了你的功能名称冲突.
呃,是的 这就是为什么它通常使用匿名函数完成.我只是使用一个命名函数来显示一个更熟悉的形式,它做同样的事情.
需要指出的是,这与闭包无关.
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有