为什么我必须使用“this”来访问函数的内部属性

时间:2012-03-06 13:00:01

标签: javascript

之间有什么区别
function person(first_name, last_name) {
    this.first = first_name
    this.last  = last_name
}

和此:

function person(first_name, last_name) {
    var first = first_name
    var last  = last_name
}

为什么只有第一个person.first& person.last可以在函数外部访问吗?

7 个答案:

答案 0 :(得分:2)

编写构造函数时(使用new) - 使用this.XXX

添加属性

然后你做:

var p = new Person('s','d');

然后您就可以访问p.first等。

在第二个例子中: 你没有创建任何属性..

你只是创建私人变量。

所以你无法访问它们......

答案 1 :(得分:2)

通过使用this.something你说这是一个对象,而且是他的财产。

通过使用var,你说它只是一个变量,而不是一个属性。

有关变量vs属性的更多信息: http://javascriptweblog.wordpress.com/2010/08/09/variables-vs-properties-in-javascript/

答案 2 :(得分:2)

由于function scope

变量生命周期在函数的花括号之间。 this关键字允许访问其外部的函数属性。

绝对要看一下这个链接:https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope

答案 3 :(得分:2)

函数中的this关键字称为调用上下文

1)如果您将函数定义为对象的成员(方法):

myObject.someMethod = function() { this.x = 2; };

然后调用上下文this是要添加方法的对象myObject。因此,在调用上面的myObject.someMethod();之后,myObject.x就是2.成员x在您调用方法之前是未定义的,除非您之前定义过它。

2)如果您使用函数作为new关键字的构造函数,则this引用正在创建的新对象:

function MyX() { this.x = 3; };
var myX = new MyX();

然后,您将属性myX.x设置为3.

请注意,我调用了构造函数MyX(),而不是myX()。您应该致电Person(),而不是person()。它只是一个约定,但指示函数是用作构造函数是很有用的。

3)最后,如果您在既不是方法也不是构造函数的函数中使用this,则this引用全局对象({{ 1}}或等同于document)。但请注意,如果您在window模式下使用javascript(您应该这样做),strict在这种情况下是未定义的,这意味着您基本上不能在函数中使用this不是方法或构造函数。


您的具体问题涉及案例2),构造函数。构造函数中的this只是设置新创建的对象的属性this.x = 3。创建一些对象x后,您可以使用myX在外部访问和修改x作为任何其他对象属性。

答案 4 :(得分:1)

'var'关键字使变量作用域。在最后一个示例中,var first和var last create只能在函数范围内访问。您可以在构造函数中将其视为局部变量。

答案 5 :(得分:1)

在javascript中,您将变量声明为

    var variable

它只存在于您声明它的方法中。如果您希望每个人都可以访问变量(即全局变量),则必须在没有'var'部分的情况下声明变量

答案 6 :(得分:0)

您不一定要使用this。如果你有这样的结构,它也可以正常工作:

Person = function(first_name, last_name) {
    var first, last;
    create(first_name, last_name);    

    function create(first_name, last_name) {
        first = first_name
        last  = last_name
    }

    return {
        firstName: first,
        lastName: last
    }
}