zoukankan      html  css  js  c++  java
  • call()和apply()

    每个函数都包含apply和call方法。
    相同点:都接收两个参数,一个是在其中运行函数的作用域,另一个是参数;
    不同点:call方法和apply的不同之处在于接收参数的方式不同;
    apply方法第二个参数可以是array的实例,也可以是arguments对象

     1 function test(a,b) {
     2     return a+b;
     3 }
     4 function test1(a,b) {
     5     return test.apply(this,[a,b]);  //因为在全局作用域内调用,所以this指向window,传入数组
     6 }
     7 function test2(a,b) {
     8     return test.apply(this,arguments);  //传入arguments对象,arguments包含传入函数的所有参数
     9 }
    10 console.log(test1(1,1))  //2
    11 console.log(test2(1,1))  //2
    call方法,传递给函数的参数必须逐个列举出来

    1 function test3(a,b) {
    2     return test.call(this,a,b);
    3 }
    4 console.log(test3(1,1))  //2

    它们真正强大的地方是能够扩充函数运行的作用域,改变函数体内this的指向

     1 window.name="is window";
     2 var obj={
     3     name:"is obj"
     4 }
     5 function app() {    //定义一个全局函数
     6     console.log(this.name);   //this是指向window的
     7 }
     8 app();   //is window
     9 app.call(this);   //is window
    10 app.call(window); //is window
    11 app.call(obj);   //is obj
    直接调用函数打印出 is window,因为this是指向window的;app.call(this)和app.call(window)则显式地在全局作用域下调用函数的方式,也会打印出 is window;而app.call(obj),则改变了函数体内this的指向,将this指向了obj对象,所以打印出来is obj。

  • 相关阅读:
    poj3468(A Simple Problem with Integers)线段树+树状数组
    关于JVM——JVM内存模型
    关于JVM——类加载机制
    关于JVM(二)
    关于JVM(一)
    关于LongAdder
    关于Future
    关于Fork/Join
    关于Atomic
    关于LockSupport
  • 原文地址:https://www.cnblogs.com/aizz/p/9357481.html
Copyright © 2011-2022 走看看