快速理解javascript中的this

作者: 猿小v | 来源:发表于2016-05-10 23:27 被阅读217次
javascript中的this.png

一些误解


  1. 指向自身?(并不是所有时候都指向自身
  2. 作用域问题?(this并不一定指向函数的作用域,并且在任何时候都不指向函数的词法作用域
  3. this到底是什么?(this是运行时绑定的并不是在编写时绑定,他的上下文取决于函数调用时的各种条件和函数声明的位置没有任何关系,只取决于函数的调用方式

this的指向


  1. 全局范围使用this和全局函数调用都指向全局对象(在严格模式下undefined)
  2. 方法调用内this指向调用对象
  3. new绑定调用构造函数,在函数内部指向新创建的对象
  4. 通过call、apply显式的的设置this对象,指向设置的对象

关于call、apply、bind


var links = document.querySelectorAll('nav li');

for (var i = 0; i < links.length; i++) {

console.log(this); // [object Window]}

有时候我们需要根据实际的需求来变化代码的作用域,就需要
call、apply、bind动态的传入函数引用。

var links = document.querySelectorAll('nav li');

for (var i = 0; i < links.length; i++) {

(function () {

console.log(this);

}).call(links[i]);
}

其中.call(scope, arg1, arg2, arg3)输入单个参数,而.apply(scope, [arg1, arg2])输入数组作为参数。在ES5中引入了bind方法,bind()并不触发函数,它仅仅是在函数触发前绑定值。

nav.addEventListener('click', toggleNav.bind(scope, arg1, arg2), false);

在不需要调用的时候就可以传递参数,函数并没被触发,scope可以被改变,且参数在等着传递。

其它

bind源码

if(!('bind' in Function.prototype)){
    Function.prototype.bind = function(){
        var fn = this, 
            context = arguments[0], 
            args = Array.prototype.slice.call(arguments, 1);
        return function(){
            return fn.apply(context, args.concat(arguments));
        }
    }
}

bind()方法通常被用在上下文丢失的场景下,例如面向对象和事件处理。之所以要这么做,是因为节点的addEventListener方法总是为事件处理器所绑定的节点的上下文中执行回调函数,这就是它应该表现的那样。但是,如果你想要使用高级的面向对象技术,或需要你的回调函数成为某个方法的实例,你将需要手动调整上下文。这就是bind方法所带来的便利之处。
bind源码中调用了Array的slice方法,我们知道arguments对象并不是一个真正的数组,而是一个类数组对象,虽然具有length属性,并且值也能够被索引,但是它们不支持原生的数组方法,例如slice和push。但是,由于它们具有和数组类似的行为,数组的方法能够被调用和劫持,因此我们可以通过类似于上面代码的方式达到这个目的,其核心是利用call方法。

相关文章

  • 快速理解javascript中的this

    一些误解 指向自身?(并不是所有时候都指向自身) 作用域问题?(this并不一定指向函数的作用域,并且在任何时候都...

  • 从java到javascript的快速入门

    从java到javascript的快速入门 本文专门为学过C语言的Java程序员,快速理解javascript语言...

  • 快速理解javascript中的闭包

    首先要理解作用域 在JavaScript中,作用域通常是指代码的上下文(context)。能够定义全局或者局部作用...

  • javascript中this的理解

    早期的博客2this是javascript的一个关键字,代表函数运行时,自动生成的一个内部对象,只能在函数内部使用...

  • 理解JavaScript中的this

    前言 做为一个初学者,原型与闭包可以说是 JavaScirpt 中理解起来最难的部分了,当然,目前了解的也只是了解...

  • 理解JavaScript中的this

    理解this JavaScript中的this是其灵活性的表现,同时也因为this的多变性与其他语言的不一致,也成...

  • 理解Javascript中的this

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁...

  • javascript中this的理解

    this在javascript中一直是新手难以理解的一部分。其实并不难,只要清楚几种调用模式,就容易掌握了。 函数...

  • 理解Javascript中this

    在 学习JavaScript 的过程中,this 这个关键字常常困扰着初学者甚至一些进阶的开发者;尤其对一些学过面...

  • JavaScript中‘this’理解

    1. this之谜 在JavaScript中,this是当前执行函数的上下文。因为JavaScript有4种不同的...

网友评论

    本文标题:快速理解javascript中的this

    本文链接:https://www.haomeiwen.com/subject/zewyrttx.html