Javascript apply() 不适用于括号表示法中的 var
Javascript apply() not working with var in bracket notation
我想使用 apply() 调用一个函数,但是当我用括号表示法传递一个 var 时,它不再起作用了。为什么这不起作用?谢谢
window.video['play'] = OK
window.video.play = OK
obj[p[i]] = not OK <= something like this I'd like to use
var obj = window;
var prop = 'video.play';
var p = prop.split('.');
for (var i = 0; i < p.length; i++) {
obj = obj[p[i]];
}
var orig = obj; // problem here with obj: window.video['play'] = OK, but obj[p[i]] = not OK
obj = function() {
var ar = Array.prototype.slice.call(arguments);
console.log(ar); // not work!
orig.apply(this, ar);
};
几乎相同,但这有效:
var orig = window.video.play;
window.video.play = function() {
var ar = Array.prototype.slice.call(arguments);
console.log(ar); // work!
orig.apply(this, ar);
};
tld;dr:如果你想改变video.play
的值,那么你必须显式地赋值给它.仅因为 obj
与 video.play
具有相同的值并不意味着分配给 obj
将更改 video.play
.
的值
obj
是一个变量。为变量分配新值并不会神奇地将新值分配给另一个变量或 属性。让我们来一些 ASCII 艺术。
让我们从
开始
var foo = {
fn: function() {
console.log(foo);
},
};
这会在内存中创建以下对象结构:
+--------------+
+----+-----------+ | Object#123 |
|foo | ref:123 *+------>+------+-------+ +--------------+
+----+-----------+ | fn | *---+---->| Function#456 |
+------+-------+ +--------------+
如果我们将函数分配给另一个变量,例如
var bar = foo.fn;
然后bar
直接指向函数对象
+--------------+
| Object#123 |
+--->------+-------+ +--------------+
| | fn | *--+----->| Function#456 |
+----+-----------+ | +------+-------+ +--------------+
|foo | ref:123 *+--+ ^
+----+-----------+ |
|bar | ref:456 *+------------------------------------+
+----+-----------+
现在,分配一个 new 值 bar
就可以做到这一点:它会使 bar
指向另一个值,但它不会对 foo
或 foo.fn
的任何影响:
bar = function() {
console.log('bar');
};
可以看到,foo.fn
仍然指向原来的函数:
+--------------+
| Object#123 |
+--->+------+-------+ +--------------+
| | fn | *---+---->| Function#456 |
+----+-----------+ | +------+-------+ +--------------+
|foo | ref:123 *+--+
+----+-----------+ +--------------+
|bar | ref:789 *+------>| Function#789 |
+----+-----------+ +--------------+
我想使用 apply() 调用一个函数,但是当我用括号表示法传递一个 var 时,它不再起作用了。为什么这不起作用?谢谢
window.video['play'] = OK
window.video.play = OK
obj[p[i]] = not OK <= something like this I'd like to use
var obj = window;
var prop = 'video.play';
var p = prop.split('.');
for (var i = 0; i < p.length; i++) {
obj = obj[p[i]];
}
var orig = obj; // problem here with obj: window.video['play'] = OK, but obj[p[i]] = not OK
obj = function() {
var ar = Array.prototype.slice.call(arguments);
console.log(ar); // not work!
orig.apply(this, ar);
};
几乎相同,但这有效:
var orig = window.video.play;
window.video.play = function() {
var ar = Array.prototype.slice.call(arguments);
console.log(ar); // work!
orig.apply(this, ar);
};
tld;dr:如果你想改变video.play
的值,那么你必须显式地赋值给它.仅因为 obj
与 video.play
具有相同的值并不意味着分配给 obj
将更改 video.play
.
obj
是一个变量。为变量分配新值并不会神奇地将新值分配给另一个变量或 属性。让我们来一些 ASCII 艺术。
让我们从
开始var foo = {
fn: function() {
console.log(foo);
},
};
这会在内存中创建以下对象结构:
+--------------+
+----+-----------+ | Object#123 |
|foo | ref:123 *+------>+------+-------+ +--------------+
+----+-----------+ | fn | *---+---->| Function#456 |
+------+-------+ +--------------+
如果我们将函数分配给另一个变量,例如
var bar = foo.fn;
然后bar
直接指向函数对象
+--------------+
| Object#123 |
+--->------+-------+ +--------------+
| | fn | *--+----->| Function#456 |
+----+-----------+ | +------+-------+ +--------------+
|foo | ref:123 *+--+ ^
+----+-----------+ |
|bar | ref:456 *+------------------------------------+
+----+-----------+
现在,分配一个 new 值 bar
就可以做到这一点:它会使 bar
指向另一个值,但它不会对 foo
或 foo.fn
的任何影响:
bar = function() {
console.log('bar');
};
可以看到,foo.fn
仍然指向原来的函数:
+--------------+
| Object#123 |
+--->+------+-------+ +--------------+
| | fn | *---+---->| Function#456 |
+----+-----------+ | +------+-------+ +--------------+
|foo | ref:123 *+--+
+----+-----------+ +--------------+
|bar | ref:789 *+------>| Function#789 |
+----+-----------+ +--------------+