您如何向知道其所包含概念的人(例如函数,变量等)解释JavaScript闭包,但不了解闭包本身?
我已经看过维基百科上给出的Scheme示例,但遗憾的是它并没有帮助.
我曾经知道这意味着什么,但我现在正在努力...
这基本上是说document.onload吗?
(function () {
})();
Run Code Online (Sandbox Code Playgroud) 在javascript中,你想什么时候使用它:
(function(){
//Bunch of code...
})();
Run Code Online (Sandbox Code Playgroud)
对此:
//Bunch of code...
Run Code Online (Sandbox Code Playgroud) 你能解释一下JavaScript中封装的匿名函数语法背后的原因吗?为什么这样做:(function(){})();但这不是:function(){}();?
在JavaScript中,可以创建一个这样的命名函数:
function twoPlusTwo(){
alert(2 + 2);
}
twoPlusTwo();
Run Code Online (Sandbox Code Playgroud)
您还可以创建匿名函数并将其分配给变量:
var twoPlusTwo = function(){
alert(2 + 2);
};
twoPlusTwo();
Run Code Online (Sandbox Code Playgroud)
您可以通过创建匿名函数来封装代码块,然后将其包装在括号中并立即执行:
(function(){
alert(2 + 2);
})();
Run Code Online (Sandbox Code Playgroud)
这在创建模块化脚本时非常有用,可以避免使当前作用域或全局作用域混乱,并且可能存在冲突的变量 - 例如Greasemonkey脚本,jQuery插件等.
现在,我理解为什么会这样.括号包含内容并仅公开结果(我确定有更好的方法来描述),例如with (2 + 2) === 4.
但我不明白为什么这也不起作用:
function(){
alert(2 + 2);
}();
Run Code Online (Sandbox Code Playgroud)
你能解释一下吗?
我是JavaScript和YUI的新手.在YUI库示例中,您可以找到此构造的许多用法:
(function() {
var Dom = YAHOO.util.Dom,
Event = YAHOO.util.Event,
layout = null,
...
})();
Run Code Online (Sandbox Code Playgroud)
我认为最后几个括号是在声明之后执行该函数.
...但是围绕函数声明的前一组括号怎么样?
我认为这是一个范围问题; 这是将内部变量隐藏到外部函数和可能的全局对象中.是吗?更一般地说,这些括号的机制是什么?
有一个JSLint选项,实际上是一个好的部分,"[需要]围绕立即调用的parens,"意味着构造
(function () {
// ...
})();
Run Code Online (Sandbox Code Playgroud)
反而需要写成
(function () {
// ...
}());
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 任何人都可以解释为什么第二种形式可能被认为更好?它更有弹性吗?不容易出错?它比第一种形式有什么优势?
自从提出这个问题以来,我逐渐理解了在函数值和函数值之间进行清晰视觉区分的重要性.考虑立即调用的结果是赋值表达式的右侧的情况:
var someVar = (function () {
// ...
}());
Run Code Online (Sandbox Code Playgroud)
尽管最外面的括号在语法上是不必要的,但是左括号给出了一个预先指示,即所分配的值不是函数本身,而是调用函数的结果.
这类似于Crockford关于构造函数大写的建议 - 它可以作为任何查看源代码的人的视觉提示.
我最近将当前版本的json2.js与我在项目中的版本进行了比较,并注意到函数表达式的创建和自我执行方式有所不同.
用于在括号中包装匿名函数然后执行它的代码,
(function () {
// code here
})();
Run Code Online (Sandbox Code Playgroud)
但现在它将自动执行的函数包含在括号中.
(function () {
// code here
}());
Run Code Online (Sandbox Code Playgroud)
有通过CMS在接受答案的注释解释JavaScript的封装匿名函数的语法是"既:(function(){})();和(function(){}());有效."
我想知道有什么区别?前者是否通过绕过全局匿名函数来占用内存?括号应该放在哪里?
可能重复:
"(function(){})()"和"(function(){}())"在JavaScript中功能相同吗?
这是我还没有想到的东西,但是我一直在使用function(){}(),因为我添加了括号后我的VIM语法突出显示,虽然我已经看过(function(){}) ()很多次,也许它是一个IE的东西?
编辑:
var singleton = function() {
// code
}();
var singleton = (function() {
// code
})();
Run Code Online (Sandbox Code Playgroud) 我是一个熟练的程序员,使用JavaScript,但我不是大师.我知道你可以用它做一些非常强大的东西,除了相当基本的DOM操作之外我还没有看到太多东西.我想知道人们是否可以使用JavaScript提供一些传统设计模式概念的例子,例如Factory Method,Singleton等.在什么情况下这些模式将用于网络?
javascript singleton design-patterns strategy-pattern factory-method
请不要害怕使用任何技术术语或低级别的解释.我非常精通计算机体系结构和低级编程语言,可以理解任何优化或内存管理技术,以及复杂的结构(类,成员变量等).
我主要关注的是基于Web的应用程序.我经常使用PHP,而且我一直在快速学习CSS.然而,Javascript目前是我的瓶颈.我知道足够的Javascript来做任何sans框架(DOM操作,AJAX查询等).我也知道我可以让我的代码运行得更快,针对特定情况进行优化,并且我可以通过手动编码所有内容来缩小代码的总体大小(不包括外部脚本).然而,为了便于其他程序员阅读和编码速度,我试图学习至少一个Javascript框架.
在阅读了许多框架的文档并查看了一些教程后,我更喜欢jQuery.它允许在一行中使用非常强大的迭代代码,并且它具有很小的全局变量命名空间冲突的可能性.从我所知道的,声明的唯一全局变量是$变量,其他所有变量都发生在这个名称空间内,如果你想要并排使用两个框架,甚至还有方法可以访问没有这个变量的命名空间.它还有一个非常小的文件包含(24千字节gzip),这意味着更少的服务器负载.
我的问题是创建jQuery插件的好方法是什么?如果我开始在jQuery的编码网站,我应该如何去了解它的最佳的互操作性和设计?我想确保我的代码可以运行沿侧任何其他jQuery的无干扰,有可能构建插件关我的代码,我尽量少用jQuery的命名空间,这样我不偷,可能被另一个使用的变量脚本.