Javascript:使用新关键字构造函数的词法范围问题

时间:2017-12-09 01:02:16

标签: javascript

我有关于javascipt的范围界定的问题。我尝试使用" new"创建新对象。关键字没有任何问题。代码看起来像这样

"use strict";

 function Person() {
     this.name = "john doe";
     console.log(this.name);
 }

 Var foo = new Person() 

我遇到的问题是当我尝试添加内部函数时,名称变量的范围在内部函数内变为未定义

 "use strict";

 function Person() {
         this.name = "john doe";

         Function speak() {
                   console.log("my name is" + this.name);
         }

         speak();
  }

  var foo = new Person();

 //error: "cannot read property 'name' of undefined"

有人能解释一下这似乎是什么问题吗?谢谢你们

3 个答案:

答案 0 :(得分:1)

使用<{1}}创建对象时,使用严格模式new Person()引用没有this的{​​{1}}对象叫window。名为property的{​​{1}}属于name对象。 因此,您收到错误property

使用另一个变量来保存name对象的Person的值,以便在内部函数中使用它。

cannot read property 'name' of undefined

Person

答案 1 :(得分:0)

您还可以speak提供与this相同的范围。应该注意的是,这也将使它成为一个公共函数,因此可以从speak类的外部调用Person

function Person() {
    this.name = "john doe";

    this.speak = function() {
        console.log("my name is " + this.name);
    };
         
    this.speak();
}

var foo = new Person();

答案 2 :(得分:0)

this由调用函数的方式(而不是在定义函数的位置)确定。由于this.name在其自己的范围内,因此它丢失了对this.name的引用,而是引用了一个全局窗口对象。

使用this关键字在嵌套函数内部时要意识到这一事实,这一点很重要,您很可能会丢失对您内部和内部对象的引用this关键字最终将引用全局对象。

使用callapply方法可以为您的示例提供另一种解决方案。 使用callapply可以在执行函数时更改this的值。

'use strict';

function Person () {
    this.name = 'john doe';

    function speak () {
        console.log('my name is: ' + this.name);
    }

    speak.call(this);
}

var foo = new Person();