JavaScript函数中this的四种绑定策略

时间: 2019-01-02阅读: 314标签: this

再一次进行对this知识点的复习,每一次都是温故知新的过程。这次对于this的学习基于《你所不知道的JavaScript》这本书,算是对于书中的知识做一个总结。

首先要明确的是一般情况下,this不是函数被定义时绑定,而是函数被调用时被绑定  

那么函数中的this有四种绑定方式:


1. 默认绑定

直接调用函数,使用不带任何修饰的函数进行调用,只能使用默认绑定,无法应用其它规则,代码如下:
function foo() {
  console.log(this.a);
}
var a = 1;
foo() // 1

2. 隐式绑定

函数被调用时有上下文对象,那么this会绑定这个上下文对象,代码如下:
function foo() {
  console.log(this.a);
}
var obj = {
  a: 2,
  foo: foo
}
var a = 1;
obj.foo() // 2

其实不能讲foo这个函数属于obj对象,但是foo函数被调用时的落脚点的确是指向obj对象,当函数引用有上下文对象时,隐式绑定就会把函数调用中的this绑定到这个上下文对象;

对象属性引用链中只有最顶层或者说最后一层会影响调用位置

var foo = function () {
  console.log(this.a)
}
var obj2 = {
  a: 2
  foo: foo
}
var obj1 = {
  a: 1
  obj2: obj2
}
obj1.obj2.foo() // 2

隐式丢失

对于应用隐式绑定方式绑定this经常导致的一个情况是隐式丢失this

function foo() {
  console.log(this.a);
}
var obj = {
  a: 2,
  foo: foo
}
var bar = obj.foo;
var a = 'global';
bar() // 'global'

针对这种情况,虽然bar是obj.foo的一个引用,但是实际上它引用的是foo函数本身,此时bar()其实是一个不带任何修饰的函数调用,应用了默认绑定;


3. 硬绑定

使用call,apply或者bind,在调用函数的时候直接指定上下文对象,那么函数中的this会绑定到传入的对象,代码如下:
function foo() {
  console.log(this.a);
}
var obj = {
  a: 1
}
foo.apply(obj) // 1

4. new绑定

使用new调用某个构造函数,代码如下:
function Foo(a) {
  this.a = a;
  console.log(this.a);
}
var obj = new Foo(2);
console.log(obj.a) // 2



Nodejs中的this

以下内容都是关于在nodejs中的this而非javascript中的this,nodejs中的this和在浏览器中javascript中的this是不一样的。暂时我们先了解到这里,后面有机会我们会聊到module

JS匿名函数this调用变量报错

突然,看到附件选择的方法,人家是设置的this.fileUrl成功的。比对下,什么区别。这就是JS中匿名方法的this指向问题,function的声明方式,this指向的是本身,父级的变量都无法访问。

Js函数作用域、执行环境(this)、call、apply、bind 的用法

函数作用域:在 JavaScript 中,作用域为可访问变量,对象,函数的集合。JavaScript 函数作用域: 作用域在函数内修改。this对象是在运行时基于函数的执行环境绑定的。

vue项目中如何在外部js文件中直接调用vue实例——比如说this

一般我们都是在main.js中引入vue,然后在vue文件中直接使用this(this指向的是vue实例),但是在实际开发中,我们往往会引入外部的js文件使用this,这个this就会指向window,并不是我们期待的vue实例

this指向和apply,call,bind三者的区别

this指向,apply,call,bind的区别是一个经典的面试问题,同时在项目中会经常使用到的原生的js方法。同时也是ES5中的众多坑的一个。ES6中可能会极大的避免了this产生的错误

关于this

在参考了以上关于this的资料后,整理了一些个人认为比较有用的点,和一些自己的见解。写的有些仓促,不对的地方希望指正,共同进步。用call来解释this很形象啊,但是不是那么严谨,详情看补充1;

js手写实现apply,call,bind

apply和call的区别就是传的参数形式不一样。call是一个一个的传,apply可以将参数以数组的形式传进去。而bind是传入第二个和后面的参数,且绑定this,返回一个转化后的函数。

this指向问题的经典场景

以函数形式调用,this指向window;以方法形式调用,this指向调用方法的那个对象;构造函数调用,this指向实例的对象;使用window对象的方法使,指向window;多重场景改变this指向

改变this的指向

this是Javascript语言的一个关键字。它代表函数运行时,自动生成的一个内部对象.this永远指向函数的调用者。随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象。

JavaScript this常见指向问题

this的用法:直接在函数中使用 谁调用这个函数this就指向谁 ,对象中使用, 一般情况下指向该对象 ,在构造函数中使用

fly63.com版权所有,内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权,请与小编联系!情况属实本人将予以删除!

广告赞助文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全