在嵌套函数中使用`this`作为父函数

时间:2013-12-22 01:41:18

标签: javascript jquery class oop object

在Apple“类”中,嵌套函数countSeeds()如何检索值this.price

jsfiddle: http://jsfiddle.net/VGqEa/

Apple = function() {
    this.price = 17

    this.cutOpen = function() {

        console.log(this.price);
        countSeeds();

        function countSeeds() {
            console.log(this.price);
        }
    }        
}


var apple = new Apple();
apple.cutOpen();

输出

17
undefined

2 个答案:

答案 0 :(得分:8)

var self = this放在Apple的顶部,然后在嵌套函数中将其称为self。

即:

Apple = function() {
    var self = this;
    this.price = 17

    this.cutOpen = function() {

        console.log(this.price);
        countSeeds();

        function countSeeds() {
            console.log(self.price);
        }
    }        
}


var apple = new Apple();
apple.cutOpen();

您也可以将self=this语句放在this.cutOpen的开头,因为这仍然会引用cutOpen中的Apple对象(因为它是Apple的一种方法)。

<强>更新

大多数常青浏览器现在支持箭头功能,因此您可以像下面这样编写:

Apple = function() {
    var self = this;
    this.price = 17

    this.cutOpen = function() {

        console.log(this.price);
        let countSeeds = () => {
            console.log(this.price);
        };
        countSeeds();
    }        
}

这在IE11或其他旧版浏览器中不起作用,除非您使用某种转换器来定位较旧的JavaScript。

答案 1 :(得分:1)

默认情况下,在不提供上下文的情况下调用函数时,this引用window对象。如果您不喜欢默认设置,请尝试callapply设置上下文:

this.cutOpen = function() {

        console.log(this.price);
        countSeeds.call(this); //use call to set the context for the function.

        function countSeeds() {
            console.log(this.price);
        }
    }  

我建议您将countSeeds移到构造函数外部,以防止多次重新定义:

function countSeeds() {
            console.log(this.price);
        }

Apple = function() {
    this.price = 17

    this.cutOpen = function() {

        console.log(this.price);
        countSeeds.call(this);
    }        
}

或者将countSeeds定义为原型的功能:

 Apple = function() {
        this.price = 17

        this.cutOpen = function() {

            console.log(this.price);
            this.countSeeds(); //use countSeeds as an instance method.
        }        
    }

    Apple.prototype.countSeeds = function () {
          console.log(this.price);
    }

在我看来,countSeeds在这种情况下应该是一个实例方法,因为 它总是访问 当前实例的price属性,如果thiswindow

,则 无法正常工作