用var和this声明变量,存在一个作用域的问题
var是在当前作用域(scope)中声明一个变量,而this则是指向当前上下文(context)
函数的上下文是在函数调用的时候决定的,如果函数有其他对象在调用,则this指向的上下文为这个对象,如果就只是一个函数,则此时的上下文为root(window或者global)
var可以定义一个局部变量,当然如果var定义在最外层的话,就是全局的局部变量,也就算是全局变量了
而this关键字定义的变量准确的说应该算是成员变量。即定义的是调用对象的成员变量
另外在“类(构造函数)”中,我们通常也会用var定义私有属性,而this定义公共属性
function test(){this.var1 = 1; var var2 = 2;}
var a = new test();
a.var1
1
function test(){this.var1 = 1; var var2 = 2;}
var a = new test();
a.var2
undefined
var t = "A";
function test(){
var t = "B";
//this.t = "C";
console.log(t);
console.log(this.t);
console.log(this);
}
var obj = new test(); //this此时的上下文为obj
test(); //this此时的上下文为root(window或者global)
VM349:5 B
VM349:6 undefined
VM349:7 test {}
VM349:5 B
VM349:6 A
VM349:7 Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
var t = "A";
console.log(t);
console.log(this.t);
console.log(this);
VM356:3 A
VM356:4 A
VM356:5 Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
foo.bar() // 上下文是foo(this === foo)
var bar = foo.bar
bar() // 上下文是root
bar.apply(obj) // 上下文是obj
bar.call(obj) // 上下文是obj