函数范围如何在JavaScript中运行?

Sim*_*mon 1 javascript scope

我在理解JavaScript中的函数范围时遇到了一些麻烦:

function Person() {
    var _firstName;
    var _lastName;
}
personOne = new Person();
personOne._firstName = "Fred";
alert(personOne._firstName);  
Run Code Online (Sandbox Code Playgroud)

这输出"Fred",但我认为Person函数的变量只能在函数内部访问.它为什么有效?

Mat*_*zer 5

在JavaScript中,对象是可动态扩展的.

例如:

var obj = {};
obj.firstName = "Matías"; // <-- This adds the property even if it doesn't exist
Run Code Online (Sandbox Code Playgroud)

另一方面,如果要声明属性应该是构造函数中对象的一部分,则需要使用以下内容对它们进行限定this:

function Person() {
    this._firstName = null;
    this._lastName = null;
}
Run Code Online (Sandbox Code Playgroud)

额外信息

如果要避免对象动态扩展,可以使用ECMA-Script 5 Object.preventExtensions函数:

var obj = {};
Object.preventExtensions(obj);

// This property won't be added!
obj.text = "hello world";
Run Code Online (Sandbox Code Playgroud)