node和浏览器运行的区别
1.浏览器环境是 this===window 创建GO对接console.log(this)===console.log(window)
2.node环境{}空对象,console.log(window) 报错,console.log(this) {}空对象
this 到底指向
- 函数调用是,js默认给this绑定一个值
- this的绑定和定义的位置没有关系
- this的绑定和调用方式以及调用的位置有关系
var obj = { name: 'why', foo: function () { console.log(this) }, } var obj2 = { name: 'obj2', bar: obj.foo, } obj2.bar() //this指向obj2和调用位置有关
var obg={ name:'why', foo:function(){ console.log(this) } } var bar=obg.foo bar()//独立调用所以this指向window var obg={ name:'why', foo:function(){ console.log(this) } } obg.foo() //指向obg
- this是在运行时被绑定
- 默认绑定
function foo(){console.log(this)} foo() 默认指向window
- 隐式绑定
var obg={ name:'why', foo:function(){ console.log(this) } } obg.foo() //指向obg 隐式绑定 var obj = { name: 'why', foo: function () { console.log(this) }, } var obj2 = { name: 'obj2', bar: obj.foo, } obj2.bar() //指向obj2 和调用位置有关 隐式绑定
- 显示绑定
1.方法 var obj = { name: 'obj', } function foo() { console.log(this) } //执行函数有并且可以通过call和apply,bind改变this的指向 foo.call() foo.apply() foo() foo.call('obj') foo.apply('1231') 2.方法2 var obj = { name: '12312', } function foo(num, num2) { console.log(this, num2, obj.name, this.name) } //call 参数传的是字符串 apply参数传的是数组 foo.call(obj, 123, 666) foo.apply(obj, [123, 666]) //bind改变this的值//每次执行都返回新的对象 var obj = { name: '12312', } function foo() { console.log(this) } var newFn = foo.bind(obj) newFn() newFn() newFn() //优化了方法1的写法 foo.call('obj') foo.call('obj') foo.call('obj') //new绑定 this完成构造器的时候绑定的 function Person(name) { this.name = name } var p1 = new Person(213) var p2 = new Person(123) console.log(p1, p2)
- new绑定