作者kilva (嗡嗡)
看板Ajax
标题Re: [问题] (...)()或(...)(window)是什麽意思?
时间Sat Jul 14 00:28:09 2012
这种写法称为匿名函式;在JavaScript设计模式中,也称为立即函式,因为此
函式会在定义时立即执行。
立即函式有两种写法:
(function(arg){
// 程式码
}(in));
或
(function(arg){
// 程式码
})(in);
其中的in用来传入值给参数arg。如:
(function(person,career){
console.log(person + " is a " career);
}("Eric","student"));
会显示「Eric is a student」。
立即函式是由JavaScript中的两种语法所组成的。
第一种是函式呼叫:函式可以在定义时就呼叫。
函式可以赋值给某个变数。如:
var func = function(arg){/*程式码*/};
上面的func即是一个函式,可以使用func(arg)来呼叫函式。
更甚之,函式可以在定义时就呼叫,如:
var val = function(){return 2+2}();
上面的程式码等於
var func = function(){return 2+2}; var val = func();
func是个总是传回4的函式,而val则是个值为4的变数。
(请注意函式和函式呼叫的不同之处。)
第二种是实字:实字可以赋值或不赋值给某个变数。不过函式及物件没有赋值
给某个变数时须外加上括号才会成为函式实字或物件实字。数字、字串和正规
运算式就没这个限制,如:
"a".toUpperCase(); // 会传回"A"。
/[\s]+/.exec(string); // 会传回string中匹配正规运算式的字串阵列。
1+2; // 会传回3。
(1).toString(); // 但使用数字实字的方法时须外加括号。
上面两个语法合起来即为立即函式。
「fucntion(){/*程式码*/}();」没有赋值给变数会产生错误。
「(function(){/*程式码*/}());」或「(function(){/*程式码*/})();」则为
合法的述句。
※ 引述《cyutdt (DT)》之铭言:
: 常在程式看到
: (function() {
: ...
: })();
: 或
: (function() {
: ...
: })(window);
: 我已经看过closure的相关教学和讨论
: 还是不晓得这跟closure是否有关联
: 还是跟$(document).ready(function(){});有什麽关系呢?
: 看到一些这种范例
: 不晓得为什麽要这样写
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.44.117.126
※ 编辑: kilva 来自: 114.44.117.126 (07/14 00:29)
1F:推 s25g5d4:之前有看过!function(){}() +function(){}()的写法 07/14 11:10
2F:→ MOONRAKER:实字?这什麽翻译。常数还差不多。 07/17 21:13
3F:→ MOONRAKER:或者是指identity?那叫「识别项」。 07/17 21:16
没看过实字(literal)?这明明是JavaScript中基本到不能不学的概念!
数字、字串和阵列实字可以当做是常数没问题,但只当做是常数就太可惜了。
正规运算式、函式及物件实字更是无法看做常数,也不需要有识别项来称呼。
光是「1」就已经有一些方法可用了,如:
(1).toString(); // "1"
(1).toExponential(2); // "1.00e+0"
等。(但一般还是会赋值给变数,连同内建的方法一并给予。)
4F:推 s25g5d4:object(array) literal 我大部分看都翻成物件(阵列)实字 07/17 21:26
※ 编辑: kilva 来自: 114.44.135.203 (07/17 22:19)