为什么我们可以更新javascript对象的(公共)成员(方法或属性)的值,甚至在执行后(成员应该超出传统语言的范围)?
答案 0 :(得分:0)
在JavaScript中,可以动态添加,删除或更改属性。
var obj = {
member: function() {
alert('Hi');
}
};
obj.member(); // alerts 'Hi'
alert(obj.member); // alerts the definition of the anonymous function
obj.member = 42;
alert(obj.member); // now since the property is replaced, this alerts 42
在JavaScript中设计可以轻松添加或删除属性。这是因为JavaScritp是一种动态语言,不像Java或C#等静态语言。
现在让我们看一下当我们替换使用闭包的函数时会发生什么:
function MyObj() {
var secret = 0;
this.changeSecret = function() {
secret++;
alert('Secret is: ' + secret);
}
}
var obj = new MyObj();
obj.changeSecret(); // alerts 'Secret is: 1'
// we are saving a reference for the (anomymous) function contained in 'changeSecret'
var changer = obj.changeSecret;
// and then replacing the changeSecret property with another function
obj.changeSecret = function() {
alert('I do not know the secret');
};
obj.changeSecret(); // alerts 'I do not know the secret'
changer(); // alerts 'Secret is: 2' the function still has access to variables
// inside MyObj
第二个例子有效,因为JavaScript闭包。见How do JavaScript closures work?