在函数中引用对象文字是不是很麻烦?似乎工作正常,但我想确保没有其他含义。
这是我正在谈论的示例:
代替:
var obj = { key1: "it", key2: function(){return this.key1 + " works!"} }; alert(obj.key2());
使用:
var obj = { key1: "it", key2: function(){return obj.key1 + " works!"} }; alert(obj.key2());
两者都有问题。
var obj = { key1: "it", key2: function(){ return this.key1 + " works!" } }; var func = obj.key2; alert(func()); // error
当func不叫为的方法obj,this可以参考别的东西(在这里:全局对象“ window“)。
func
obj
this
window
var obj = { key1: "it", key2: function(){ return obj.key1 + " works!" } }; var newref = obj; obj = { key1: "something else"; }; alert(newref.key2()); // "something else works"
在这里,我们从另一个引用访问该对象,尽管obj函数中的可能现在指向其他某个对象。
因此,您将不得不选择哪种情况更有可能。如果您真的想使其安全,请防止obj被交换:
// ES6 - use `const`: const obj = { key1: "it", key2: function(){ return obj.key1 + " works always!" } }; // ES5: use a closure where the `obj` is stored in a local-scoped variable: var obj = (function(){ var local = { key1: "it", key2: function(){ return local.key1 + " works always!" } }; return local; })();
或者您bind()将函数传递给对象:
bind()
var obj = { key1: "it", key2: function(){ return this.key1 + " works always!" } } obj.key2 = obj.key2.bind(obj);