在JavaScript中间接函数调用

有喜欢的东西

f.call(...) f.apply(...)

但是,再有就是这

(1, alert)('Zomg what is this????!!!11')

“1”,似乎并没有多大的意义在此背景下,以下的作品就好了:

(null, alert)('Zomg what is this????!!!11') (1, null, alert)('Zomg what is this????!!!11') (undefined, alert)('Zomg what is this????!!!11')

你可以指向ECMAScript中的特定部分,它描述了语法?

--------------解决方案-------------

你只是用逗号操作符。

这个操作者只计算从左至右操作数,并返回从第二个值,例如:

(0, 1); // 1
('foo', 'bar'); // 'bar'

在调用一个函数的情况下,操作数的评价将简单地得到一个值,而不是一个参考,这将导致该this被调用的函数指向全局对象内的值(或者它将被undefined在新的ECMAScript 5严格模式)。

例如:

var foo = 'global.foo';

var obj = {
foo: 'obj.foo',
method: function () {
return this.foo;
}
};

obj.method(); // "obj.foo"
(1, obj.method)(); // "global.foo"

正如你所看到的,第一个呼叫,这是一个直接的电话, this里面的价值method将正确引用obj (返回"obj.foo"第二个电话,由逗号运算作出评价将使this值指向(产生全局对象"global.foo"

这种模式已经得到相当受追捧,作出间接调用eval ,这可以在ES5严格模式是有用的,拿到全局对象的引用,例如,(想象你是在非浏览器环境, window不可用):

(function () {
"use strict";
var global = (function () { return this || (1,eval)("this"); })();
})();

在上面的代码中,内匿名功能将一个严格模式代码单元内执行,这将导致在具有this值作为undefined

所述||操作者现在将对第二个操作数,所述eval呼叫,它是一种间接的呼叫,并且将评估对全球词法和可变环境的代码。

但就个人而言,在这种情况下,在严格的模式我更喜欢使用的Function构造函数来获取全局对象:

(function () {
"use strict";
var global = Function('return this')();
})();

与该创建的函数Function构造只如果他们开始用使用严格的指令严格,他们不“继承”当前上下文的严格的函数声明或函数表达式做。

这是逗号分隔符,它计算其两个操作数,并返回第二个的值。

因此,像(null, alert)计算结果为alert功能,您可以立即调用使用括号。

它在ECMA-262(PDF)第11.14描述。

逗号运算引起的表达式按顺序进行评估。 括号中包裹表达式返回最后一个表达式的值。 这样(1, alert)("hello")是功能上等同于:

1;
alert("hello");

关闭我的头顶,我想不出有任何理由这样做。

分类:JavaScript的 时间:2015-03-15 人气:0
本文关键词: JavaScript的,ECMA262
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.366 (s). 10 q(s)