javascript 逗号() 函数调用小结

来源:互联网 发布:linux 切换主机 编辑:程序博客网 时间:2024/05/17 02:59
逗号运算符还是参数分隔符.


alert(5*2, 4*2); // 输出10.输入10,8两个参数,但alert仅用了第一个参数。

alert((5*2, 4*2)); // 返回8,仅输入一个参数8


此处alert接受了2个参数,逗号是参数分隔符,而非逗号运算符。
javascript中调用时实参的个数是不确定的!即使函数的定义中只有一个形参!



//////////////////////////////////////////////////

逗号运算符与赋值运算符


逗号运算符要求它的运算数是一个复杂的表达式或简单的表达式(如变量或直接量)

表达式的目的是运算求值。

语句中有表达式语句,但不是所有的语句都是表达式。如:变量声明,逻辑控制等。


var m = 5,10;//错误 (var m = 5),10;

//但由于赋值运算符优先于逗号运算符执行,因此变成左边不是一个运算数或一个表达式,而是一个含有var关键字的语句

var m = ++i,10;//error  (var m = ++i),10;

m = 5,10;//ok

var n = (++i,10);//ok

i=5*2, 4*2;

j=(5*2, 4*2);


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

在解析器解析全局的function或者function内部function关键字的时候,默认是认为function声明,而不是function表达式

括弧()和JS的&&,异或,逗号等操作符是在函数表达式和函数声明上消除歧义的


函数调用

强制运算符() 改变表达式分组和调整运算次序,把()内的当作一个整体并进行求值。
除了for ,一个独立的() 内只能有运算不能有变量声明。

//示例1.具名函数直接调用
function foo() {
}
foo();
//示例2.匿名函数通过引用来调用
fooRef = function() {
}
fooRef();
//示例3.没有引用的匿名函数的调用方法(1)
(function() {
// ...
}());
//示例4.没有引用的匿名函数的调用方法(2)
(function() {
// ...
})();
//示例5.没有引用的匿名函数的调用方法(3)
void function() {
// ...
}();


//示例6.直接使用函数调用运算符"()"调用
function() {
// ...
}()
//示例7.使用语句结束符";"来执行语句
function() {
// ...
}();

在语法检测阶段,脚本引擎会认为下面的代码:

function() {
}
//或
function foo() {
}
是函数声明——因此事实上这里使用具名函数和匿名函数都是通不过语法检
测的,而后面的讨论也因此对这二者都有效——这就会使得在示例6和示例7
的代码中,函数后面后面的一对括号没有语法意义。这样一来,它们的代码无
疑被语法解析成了:
//示意:对示例6的语法解释
function() {
// ...
};
();
//示意:对示例7的语法解释
// (略)

也就是说“function() {}”作为完整的语法结构被解释,因此相当于其后已经
存在语句结束符。而“();”则被独立成一行进行语法解释,显示这是错误的语法。

//改写示例6的代码以通过语法解释
function() {
// ...
}(1,2)
这样一来你会发现语法检测通过了。因为语句被语法解释成了:
function() {
// ...
};
(1,2);


如果你真的想在声明的时候执行一下该函数,那么请参考前本小节开始的示例
3、4、5,用一个void或括号“()”运算将函数声明变成“(直接量的)单值表
达式”:
//示例:声明时立即执行该函数(也可以用于匿名函数声明)
void function foo() {
// ...
}(1,2);

原创粉丝点击