你能解释一下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)
你能解释一下吗?
我只编写了少量运行嵌入Java应用程序的JavaScript,但它是使用QUnit测试的,已经混合了,我还没有注意到任何问题.
是否有一些传统的智慧是否在JavaScript中使用分号?
我希望有人可以向我解释为什么在浏览器中查看HTML时,下面的JavaScript/HTML会显示"门#2":
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript">
function testprint() {
alert('door #1');
};
window.onload = testprint;
function testprint() {
alert('door #2');
};
testprint = function() {
alert('door #3');
};
</script>
<script type="text/javascript">
function testprint() {
alert('door #4');
};
</script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
由于只有声明testprint在window.onload设置之前发生testprint,我希望window.onload原因'门#1'出现.实际上,onload导致'门#2'.请注意,无论是否包含第一个声明,它都会执行此操作testprint.
第三个和第四个testprint使用声明使用不同的方式来分配函数,我试着看看它是否会覆盖window.onload同样的第二个声明的testprint行为.它没.请注意,如果我将第四个声明移动到第testprint一个脚本块的末尾,它将被调用window.onload.
对象中的函数之间有什么区别.我有两个基本上做同样事情的例子.
function a(param) {
function b(input) {
return input%10;
};
return 'The result is ' + b(param);
};
Run Code Online (Sandbox Code Playgroud)
和
function a(param) {
this.b=function(input) {
return input%10;
};
return 'The result is ' + this.b(param);
};
Run Code Online (Sandbox Code Playgroud)
两种情况下的优点和缺点是什么?在第二个我知道可以从主函数外部调用该函数.运行时还有区别吗?(比如时间和表现)
function Foo() {
var that = this;
that.bar = function() {}
that.baz = function() {}
(function() {
that.baz();
}());
}
new Foo;
Run Code Online (Sandbox Code Playgroud)
Uncaught TypeError: Object #<Foo> has no method 'baz'
that.bar工作正常,它只是最后一个不存在的功能.;在baz函数定义之后添加一个修复所有内容.
我知道排除;可以弄乱一些事情,但我认为你肯定不应该放弃;功能.没有语言可以做到.为什么;在baz函数之后排除导致此错误?我应该;在我的功能定义之后吗?
MDN使用我提供的第二个代码,它可以正常运行,但最后会引发错误。他们为什么用分号结束匿名功能?如果匿名函数不存在于函数表达式中,可以吗?如果函数不是函数表达式,则不应以分号结尾。
function makeAdder(x) {
return function(y) {
return x + y;
}
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
console.log(add5(2)); // 7
console.log(add10(2)); // 12Run Code Online (Sandbox Code Playgroud)
与
function makeAdder(x) {
return function(y) {
return x + y;
};
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
console.log(add5(2)); // 7
console.log(add10(2)); // 12Run Code Online (Sandbox Code Playgroud)
我正在研究一个jQuery插件,但是在使我的变量适当缩放时遇到了一些麻烦.这是我的代码中的一个例子:
(function($) {
$.fn.ksana = function(userOptions) {
var o = $.extend({}, $.fn.ksana.defaultOptions, userOptions);
return this.each(function() {
alert(rotate()); // o is not defined
});
};
function rotate() {
return Math.round(o.negRot + (Math.random() * (o.posRot - o.negRot)));
};
$.fn.ksana.defaultOptions = {
negRot: -20,
posRot: 20
};
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
我试图让私有函数旋转以便能够看到o变量,但它只是保持警告'o未定义'.我不确定我做错了什么.
今天是我上新工作的第一天(大型网站上的前端负责人.)我的任务之一是实现一个按钮,在点击事件时触发事件.我不知道,所以在谷歌搜索后,我想出了这个:
<html>
<head>
<script type="text/javascript">
function popup();
{
alert("Hello World") ==> alert("Hello World");
}
</script>
</head>
<body>
<input type="button" value="Click Me!" onclick="popup()"></input><br></br>
</html>
</body>
Run Code Online (Sandbox Code Playgroud)
问题是,当我点击我的按钮时,没有任何反应.
编辑根据MICHEL的评论更新