call和apply是定义在Function.prototype上的方法.

共同点:可以自由指定函数执行时内部this的指向

不同点:传参方式不同

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

apply方法: 
语法:apply(thisObj,[argArray])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
说明: 
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

/*
* 在IE以及以前,apply方法只能平铺真数组,或者内置的伪数组,
* 用户自定义的伪数组不认,会报错。
* */

var likeArray = { 0: 'abc', 1: 'cbs', length: 2 };
var obj = {};

[].push.apply( obj, [].slice.call( likeArray ) );

/*
* slice:
* 截取数组指定位置的数据,组成新的数组返回
* */

var arr = [ 1, 2, 3, 4, 5, 6 ];
console.log(arr.slice(1, 3));
console.log(arr);

// 可以借用数组的slice方法,通过伪数组得到真数组
console.log(arr.slice.call( likeArray ));

// IE8中apply不能平铺用户自定义的伪数组

// [].push.apply( target, [].slice.call( obj2 ) ); // 使用slice方法把用户自定义的伪数组转换为真数组

// 浏览器创建的DOM相关的伪数组对象
var nodes1 = document.querySelectorAll('title');
var nodes2 = document.getElementsByTagName('body');

//但是ie8却不能使用slice操作除了ECMA外的对象(比如说var obj={0:1,1:2,length:2}就是ECMA对象,而var obj1=document.querySelectorAll('title');和var obj2=document.getElementsByTagName('body');都是通过document获取的伪数组就不能用slice转换为真数组)
console.log([].slice.call(obj2));
console.log([].slice.call(nodes1)); // nodes1是DOM方法返回的伪数组,IE8报错

/*
* bind:
* ES5新增的方法,IE9及以上支持。
* bind和call、apply一样,可以自由执行函数执行时内部的this,
* 不同之处在于,call和apply会马上执行函数,
* 而bind会返回函数的copy版本,什么时候执行,由用户根据情况而定。
* */

// bind接收绑定了this的函数clone版本,
// 这个版本接收后可以多次调用。但是call和apply指定的函数只可以执行一次,想要多次执行函数,就得多次调用call和apply
var fnClone = fn.bind( ['abc', 'cbs'] );
fnClone();
fnClone();

// bind方法不光可以绑定this,还可以绑定参数
function add3( a, b, c ) {
console.log( a + b + c );
}
var add3Clone = add3.bind( null, 10, 20 );
add3Clone( 30 );

//顺便记录一下concat方法:

var arr=[1,2,3];

var arr2=[4,5,6];

var obj={0;1,1:2,2,:3,length:3};

//对于真数组,concat会把每一项合并到target中,

console.log(arr.concat(arr2));//==>[1,2,3,4,5,6]

//但是对于伪数组,concat会把伪数组整体合并到arr中

console.log(arr.concat(obj));//==>[1,2,3,{{0;1,1:2,2,:3,length:3}}]

//要想合并伪数组,只能借用slice将伪数组转换为真数组,再用apply方法将数组平铺到arr中

console.log(arr.concat([].slice.apply({0;1,1:2,2,:3,length:3})));//==>[1,2,3,1,2,3]

apply和call的更多相关文章

  1. JS核心系列:浅谈 call apply 与 bind

    在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...

  2. SQL Server-聚焦APPLY运算符(二十七)

    前言 其实有些新的特性在SQL Server早就已经出现过,但是若非系统的去学习数据库你会发现在实际项目中别人的SQL其实是比较复杂的,其实利用新的SQL Server语法会更加方便和简洁,从本节开始 ...

  3. 利用apply()或者rest参数来实现用数组传递函数参数

    关于call()和apply()的用法,MDN文档里写的非常清晰明白,在这里就不多做记录了. https://developer.mozilla.org/zh-CN/docs/Web/JavaScri ...

  4. 由js apply与call方法想到的js数据类型(原始类型和引用类型)

    原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...

  5. JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

  6. 瞬间记住Javascript中apply与call的区别

    关于Javascript函数的apply与call方法的用法,网上的文章很多,我就不多话了.apply和call的作用很相似,但使用方式有区别 apply与call的第一个参数都是一个对象,这个对象就 ...

  7. scope.$apply是干嘛的

    开始用angular做项目的时候,一定碰到过$scope.$apply()方法,表面上看,这像是一个帮助你进行数据更新的方法,那么,它为何存在,我们又该如何使用它呢. JavaScript执行顺序 J ...

  8. JavaScript中的apply,call与this的纠缠

    1.apply定义 apply:调用函数,并用指定对象替换函数的 this 值,同时用指定数组替换函数的参数. 语法:apply([thisObj[,argArray]]) thisObj 可选.要用 ...

  9. jQuery之常用且重要方法梳理(siblings,nextAll,end,wrap,apply,call,each)-(二)

    1.siblings() siblings() 获得匹配集合中每个元素的同胞,通过选择器进行筛选是可选的. <body> <div><span>Hello</ ...

  10. JS中 call() 与apply 方法

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

随机推荐

  1. iOS使用textfield注意的细节

    一般做登录界面或者要填写表之类的页面会经常使用到textfield.使用很简单,但是其实他有很多小的处理细节,这回让你显得有经验,交互性很好.在这里呢,我就直接拿stroyboard中的截图来说. c ...

  2. 04-时序逻辑电路设计之计数器——小梅哥FPGA设计思想与验证方法视频教程配套文档

    芯航线--普利斯队长精心奉献 实验目的:以计数器为例学会简单的时序逻辑电路设计 实验平台:芯航线FPGA核心板 实验原理: 时序逻辑电路是指电路任何时刻的稳态输出不仅取决于当前的输入,还与前一时刻输入 ...

  3. mysql删除带有NULL的行

    假如表A有一列,名字为“Age”,有些行对应的Age为NULL,如果要删除这些行,使用一下语句: delete from A where Age is null;

  4. 11-JS基础

    JS声明变量 变量必须以字母开头 变量也能以 $ 和 _ 符号开头(不推荐这么做) 变量名称对大小写敏感(y 和 Y 是不同的变量) **提示:JavaScript 语句和 JavaScript 变量 ...

  5. [问题2014A02] 复旦高等代数 I(14级)每周一题(第四教学周)

    [问题2014A02]  求下列 \(n\) 阶行列式的值, 其中 \(a_i\neq 0\,(i=1,2,\cdots,n)\): \[ |A|=\begin{vmatrix} 0 & a_ ...

  6. 11.安装KVM虚拟机

    安装KVM虚拟机是一大难题,不按照虚拟机物理机128G内存和强劲的CPU无法充分利用.也不便于后面的jenkins自动部署.安装KVM虚拟机过程我是借鉴了网上下载的马哥linux   KVM那块的内容 ...

  7. 03-第一个C语言程序的分析

    本文目录 一.代码分析 二.开发和运行C程序的步骤 三.总结 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语 ...

  8. window.location.href 失效的解决办法

    第一种:在window.location.href 后面加上 window.event.returnValue = false; 如: <a href="#" onclick ...

  9. java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError的区别

    java里生成对象有如下两种方式: 1: Object obj = new ClassName(); 直接new一个对象 2: Class clazz = Class.forName(ClassNam ...

  10. 鼠标点击输入框文字消失 value placeholder 以及JQ实现效果 (仿京东的输入框效果)

    鼠标点击输入框文字消失 value实现方法  placeholder实现方法     以及JQ实现placeholder效果 <input type="text" value ...