`

Function.prototype.apply.call的总结

阅读更多

 

网上看到一段代码,哎,觉得挺不错,然后来分析一下,

首先需要了解apply,call的基本用法,其目的是改变调用方法中的this指向,将其指向为传入的对象

 

代码:console.log

 

var console = window.console || {log: function () {}}; 
var log = console.log;
console.log = function(tips,message){ 
   Function.prototype.apply.call(log, console, arguments); 
   //Function.prototype.call.call(log, console, arguments);
   //Function.prototype.call.apply(log, [console, arguments]); 
  
 //传统方式
 //var args=[].slice.call(arguments);
 //log.apply(console,args);
}

 

 

执行结果:

 

console.log("测试","This is test");

 

测试 This is test

 

分析:

 

      该怎么理解Function.prototype.apply.call(log,console,arguments);呢

      首先可以将Function.prototype.apply看成一个整体-->FunctionApply

       FunctionApply.call(log,console,arguments);

       那么将此句翻译一下

       log.FunctionApply(console,arguments);

       然后再翻译一下,你就懂了吧,就是一个普通方法调用了

       console.log(arguments);

 

发散思维:

Function.prototype.call.apply(log,[console.arguments]);

 

FunctionCall.apply(log,[console,arguments]);
log.FunctionCall(console,arguments);
console.log(arguments);

 

 

小tips:

 

    Function.prototype.apply.call  等同于Function.prototype.call.call

    Function.prototype.call.apply  等同于 Function.prototype.apply.apply

 

 

免费外送个栗子:

 

function testA(a){
    console.log('aaaa',a);
}
Function.prototype.apply.call(testA,window,['Mike']);
//Function.prototype.call.call(testA,window,['Mike']);
//testA.apply(window,['Mike']);
//window.testA('Mike');
//Function.prototype.apply.apply(testA,[window,['Mike']]);
//Function.prototype.call.apply(testA,[window,['Mike']]);

 

以上执行结果都一样

    为:aaaa Mike

 

总结使用用法:

    XXX可以是call或者是apply,child一定是parent可指向的对象

    Function.prototype.XXX.call(child,parent,arguments||array);

    Function.prototype.XXX.apply(child,[parent,arguments||array]);

 

1
0
分享到:
评论
1 楼 fatbear007 2016-07-28  
怎么觉得,这种写法,让人看不懂外,可以用在哪些场景下呢?

相关推荐

    Function.prototype.call.apply结合用法分析示例

    var a = Function.prototype.call.apply(function(a){return a;}, [0,4,3]); alert(a); ``` 1. `Function.prototype.call` 方法允许我们调用一个函数,并可以指定`this`的值。它的基本形式是 `fun.call(thisArg, ...

    Function.prototype.apply()与Function.prototype.call()小结

    在JavaScript中,`Function.prototype.apply()` 和 `Function.prototype.call()` 是两种非常重要的方法,它们用于在不同的上下文中调用函数,并允许我们灵活地传递参数。这两个方法的主要区别在于处理参数的方式,但...

    Array.prototype.slice.apply的使用方法

    `Array.prototype.slice.apply` 是 JavaScript 中一种巧妙的技巧,它允许我们借用 `Array.prototype.slice` 方法来处理非数组对象,尤其是 `arguments` 对象。`arguments` 是一个伪数组对象,它在每个函数内部可用,...

    理解javascript中的Function.prototype.bind的方法

    总结起来,`Function.prototype.bind`是JavaScript中用于控制`this`的一个强大工具,它可以确保函数在任何环境下都能正确访问到`this`,这对于处理异步操作、事件处理以及构造函数等场景尤其有用。理解并掌握`bind`...

    Javascript Function.prototype.bind详细分析

    JavaScript中的`Function.prototype.bind`是一个至关重要的方法,用于创建一个新的函数——绑定函数,该函数在调用时会保持特定的`this`值和预设的参数。`bind`方法接收两个主要参数:第一个参数用于设置新函数执行...

    function.prototype:适用于Function.prototype的Polyfill。{apply,bind,call}

    函数原型polyfill 这是三个基本功能方法填充工具apply , bind和call的 是的,因为它实际上可以兼容*。 你为什么要问? 很好地证明了观点,并展示了您可以使用诸如JavaScript / ECMAScript之类的动态语言来完成的...

    Javascript中call,apply,bind方法的详解与总结

    2.Function.prototype.call() 3.Function.prototype.apply()  3.1:找出数组中的最大数  3.2:将数组的空元素变为undefined  3.3:转换类似数组的对象 4.Function.prototype.bind() 5.绑定回调函数的对象 6.call...

    js的继承方法小结(prototype、call、apply)(推荐).docx

    ### JavaScript 的继承方法小结(Prototype、Call、Apply) #### 一、JavaScript 原型继承 -- Prototype 在 JavaScript 中,“一切皆对象”。通过 `new` 关键字创建的对象是函数对象,而直接赋值的对象则是一般...

    prototype 1.3 源码解读

    Function.prototype.bindAsEventListener = function (object) { var __method = this; return function (event) { __method.call(object, event || window.event); }; }; ``` - **`Function.prototype....

    js中继承的几种用法总结(apply,call,prototype)

    在JavaScript中,实现对象继承主要有三种方式:原型链继承(prototype)、构造函数继承和call/apply继承。下面将分别详细介绍这三种继承方式的具体用法和实现原理。 1. 原型链继承(prototype) 原型链继承是...

    call与apply区别 详细解读.pdf

    call和apply是JavaScript中的两个重要方法,它们都是Function.prototype中的方法,这意味着每个函数都可以使用这两个方法。它们的作用是改变函数体内的this对象的值,以扩充函数赖以运行的作用域。 相同点:call和...

    完美解决IE低版本不支持call与apply的问题

    Function.prototype的apply和call是在1999年发布的ECMA262 Edition3中才加入的(1998年发布ECMA262 Edition2)。在此前的的浏览器如IE5.01(JScript 5.0)中是没有apply和call的。因此会带来一些兼容性问题,以下是...

    javascript中的Function.prototye.bind

    Function.prototype.bind是JavaScript中提供的一种机制,用于创建一个新的函数,这个新函数在调用时,其内部的this会被永久地绑定到bind方法调用时所指定的对象上。 在介绍Function.prototype.bind之前,开发者们...

    关于Javascript中call与apply的进一步探讨

    在JavaScript中,`call`和`apply`是两个非常重要的方法,它们都用于改变函数调用时的上下文(即`this`的值),并且可以灵活地传递参数。本篇文章将深入探讨这两个方法的用法、区别以及实际应用场景。 `call`方法...

    js中call与apply的用法小结

    在JavaScript中,`call` 和 `apply` 是两种非常重要的函数调用方式,它们都用于改变函数执行时的上下文,即`this`的指向。本文将深入探讨这两种方法的用法及其在实际编程中的应用。 ### 1. `call` 的基本用法 `...

    深化剖析JavaScript面对对象编程_.docx

    这种方法利用`call`或`apply`方法,将父构造函数的上下文(`this`关键字)绑定到子构造函数的新实例上。在`Cat`构造函数中调用`Animal.apply(this, arguments)`,确保`Animal`的初始化逻辑应用到`Cat`实例上。这样,...

    js中apply与call简单用法详解.docx

    在JavaScript中,`apply`与`call`是两个非常重要的函数,它们都属于`Function.prototype`的一部分,因此每一个函数对象都拥有这两个方法。这两个方法的主要作用在于改变函数执行时的上下文环境(`this`值),这对于...

Global site tag (gtag.js) - Google Analytics