Javascript函数中var和this的区别是什么?

17
var tools = {};

tools.triangle = function() {
    var originX = 0;
    var originY = 0;
}

 

var tools = {};

tools.triangle = function() {
    this.originX = 0;
    this.originY = 0;
}

这两个代码块之间有什么差异吗?如果之前已经问过了,请原谅。


1
var 变量是私有的。this 变量是公共的。 - elclanrs
2
@elclanrs - 这个评论并没有帮助,因为它是误导性的。变量可以声明为全局变量,this与执行上下文相关,它不是通常意义上的变量,尽管它可以被视为本地变量。 - RobG
2个回答

13

var 创建了一个本地变量,它在 tools.triangle 内部。变量 originXoriginY 无法在 tools.triangle 外部进行交互。 this 是指向当前正在处理的对象的指针。可以使用第二个示例来通过执行 new tools.triangle(); 给对象赋属性。如果你不使用 new ,而是直接使用 tools.triangle();this 将指向全局对象,即 window 对象。通过使用函数方法 call();apply(); 可以更改 this 所指向的对象,用法如下:

var myObj = {};

tools.triangle.call( myObj );

// "this" in tools.triangle now points to myObj
// myObj now has the properties originX and originY

需要知道的是,this可以引用任何对象,并且在ES5严格模式下可能未定义或为null

您可以在此处获取更多信息。


“this”需要更多的解释,它是由调用设置的,可以引用任何对象,并且在ES5严格模式下可能未定义或为null - RobG
@0x499602D2 谢谢你的回答。我真的一直在寻找这个答案。我也不知道call(和apply)方法可以改变作用域。 - GuyT
答案需要在未使用 new 的情况下进行更正。由于 triangletools 对象的实例函数,因此 this 指向 tools 对象,并调用 tools.triangle() 实际上会在 tools 对象上创建属性 originXoriginY - Sourav Paul

1
在第一个例子中,X和Y都作为本地变量存在于保存在变量“triangle”中的闭包中。
在第二个例子中,由于使用了“this”,X和Y作为对象“tools.triangle”的变量存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接