zoukankan      html  css  js  c++  java
  • 解析js中的call

    昨天看到这篇文章 http://uule.iteye.com/blog/1158829

    里面讲到call的使用方法,但是作者没有讲清楚里面的关系,我的理解是

    call方法: 
    语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 
    定义:调用一个对象的一个方法,以另一个对象替换当前对象。 
    说明: 
    call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
    如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 

    原作者在这里举例是如下的例子,他的解释是: 这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

    function Add(a, b) {
    alert(this); //输出sub函数
    alert(a + b);
    }
    function sub(a, b) {
    alert(this);
    alert(a - b);
    }
    Add.call(sub, 3, 1);

    我在两个函数之间加上了alert(this),其实这两个函数Add和sub是属于全局对象的,那么在此Add.call(sub, 3, 1);就相当于Window.Add.call(Window.sub,3,1)。这样就很明显了,call的意思是切换上下文,执行call时,上下文切换至Window.sub,可以用alert(this)来进行调试,上下文虽然切换了,但是还是调用的Window.Add。这样理解就很清楚了。

    如果不是很明白,请看下面的例子。

    function Animal() {
    this.name = "Animal";

    this.Say = function () {
    alert(this);
    alert(this.name);
    }
    }

    function Cat() {
    this.name = "Cat";
    }

    var animal = new Animal();
    var cat = new Cat();
    animal.Say.call(cat,",");

    这里加入了一些alert,便于调试,alert(this);---alert(this.name);这样的执行顺序,调用animal.Say时上下文已经切换到cat对象,所以this就指向的cat,
    this.name就等于Cat了。

    再回头看上面的,调用Add方法时,上下文切换至Sub方法,然并卵,还是执行的Add方法。原作者的举例不太恰当吧。

    参考:http://uule.iteye.com/blog/1158829

  • 相关阅读:
    【设计】B端图表设计
    用 SpringBoot,亲自打造一个在线题库系统
    玩点创意编程,发现另一个世界
    Spring Security 基本介绍,初窥路径
    一个课程,11个项目!爬虫初体验,快来!
    黑三兵后现缓涨很危险 出现急涨有转机
    JavaScript对象之get/set方法
    ES6-ES11新特性
    js常见设计模式
    再谈promise
  • 原文地址:https://www.cnblogs.com/wuyuetian/p/4999723.html
Copyright © 2011-2022 走看看