函数和对象中的闭包

Closures in functions and objects

本文关键字:闭包 对象 函数      更新时间:2023-09-26

下面的代码段也完全一样。第一个:

var obj_button = {
    clicked: 1,
    click: function() {
        console.log(clicked);
    }
};

第二个:

var Func_button = function() {
    var clicked = 1;
    this.click = function() {
        console.log(clicked);
    }
}

但当我想利用闭包时,第一种方法失败了:

func = new Func_button();
func.click(); // OK - works fine, outputs 1
obj_button.click(); // FAIL - he don't know what is "clicked"

所以我的问题是:为什么在第一种方法中,方法click()不能看到"点击"的参数。闭包不应该覆盖这个参数吗(就像第二个例子一样)?

否,因为第一个实例中的clicked在对象范围内,而第二个实例中它在函数范围内。this.click = function也在功能范围内,但click: function () {的内容在不同的范围内。

对于第一个工作示例,您可以使用:

console.log(this.clicked);

如果您重写第二个示例:,您也可以看到相同的行为

var Func_button = function() {
    this.clicked = 1;
    this.click = function() {
        console.log(clicked);
    };
}

现在,func.clicked将返回1,但调用func.click()将导致相同的错误。