我有关于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"
有人能解释一下这似乎是什么问题吗?谢谢你们
答案 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
关键字最终将引用全局对象。
使用call
或apply
方法可以为您的示例提供另一种解决方案。
使用call
和apply
可以在执行函数时更改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();