2012-03-06 85 views
0

的内在属性访问是什么为什么我必须使用“本”在函数的

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以外的功能?

+0

因为在函数的第二个版本中,变量在函数中的作用域和行为类似于C#/ Java/PHP中的私有声明等。 – Chandu 2012-03-06 13:02:42

+0

因为函数中的var将设置局部变量 – androidavid 2012-03-06 13:03:51

+0

https ://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects – nnnnnn 2012-03-06 13:04:25

回答

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全局对象document或,等价地,window)。但请注意,如果您在strict模式下使用javascript(您应该这样做),则this在这种情况下未定义,这意味着您基本上不能在不是方法或构造函数的函数中使用this


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

1

'var'关键字使变量有作用域。在最后一个例子中,var first和var last创建的变量只能在函数的作用域中访问。你可以在构造函数中看到这是一个局部变量。

2

当你写(使用new)构造函数 - 你使用添加this.XXX

性能,那么你做的事:

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

,然后你必须在第二个获得p.first

例如: youre没有创建任何属性..

你只能创建私有变量。

,所以你不能访问他们...

1

当你的JavaScript变量声明为

var variable 

它只有在你宣布它的方法内部存在。如果你希望每个人都可以访问变量(即全局变量),那么必须声明变量不带'var'部分

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 
    } 
} 
+0

鉴于使用'this'与'new person()'一起工作,这并不是真正的可比性。设置全局变量不会让你有多个“实例”。 – nnnnnn 2012-03-06 13:07:20

+0

哦,对不起。我基本上是在谈论模块模式。现在编辑它,使其更清晰。 – Harti 2012-03-06 14:03:17

相关问题