apply和call
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的更多相关文章
- JS核心系列:浅谈 call apply 与 bind
在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...
- SQL Server-聚焦APPLY运算符(二十七)
前言 其实有些新的特性在SQL Server早就已经出现过,但是若非系统的去学习数据库你会发现在实际项目中别人的SQL其实是比较复杂的,其实利用新的SQL Server语法会更加方便和简洁,从本节开始 ...
- 利用apply()或者rest参数来实现用数组传递函数参数
关于call()和apply()的用法,MDN文档里写的非常清晰明白,在这里就不多做记录了. https://developer.mozilla.org/zh-CN/docs/Web/JavaScri ...
- 由js apply与call方法想到的js数据类型(原始类型和引用类型)
原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...
- JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- 瞬间记住Javascript中apply与call的区别
关于Javascript函数的apply与call方法的用法,网上的文章很多,我就不多话了.apply和call的作用很相似,但使用方式有区别 apply与call的第一个参数都是一个对象,这个对象就 ...
- scope.$apply是干嘛的
开始用angular做项目的时候,一定碰到过$scope.$apply()方法,表面上看,这像是一个帮助你进行数据更新的方法,那么,它为何存在,我们又该如何使用它呢. JavaScript执行顺序 J ...
- JavaScript中的apply,call与this的纠缠
1.apply定义 apply:调用函数,并用指定对象替换函数的 this 值,同时用指定数组替换函数的参数. 语法:apply([thisObj[,argArray]]) thisObj 可选.要用 ...
- jQuery之常用且重要方法梳理(siblings,nextAll,end,wrap,apply,call,each)-(二)
1.siblings() siblings() 获得匹配集合中每个元素的同胞,通过选择器进行筛选是可选的. <body> <div><span>Hello</ ...
- JS中 call() 与apply 方法
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
随机推荐
- Python—进程、线程、协程
一.线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 方法: ...
- c#邮箱发送和接收
简洁版发送: //web.config ---文件 <?xml version="1.0" encoding="utf-8"?> <!-- 有 ...
- CSS 定位
一.CSS 定位和浮动 它们代替了多年来的表格布局. 定位的思想很简单,相对于正常位置.相对于父元素.另一个元素甚至是浏览器窗口的位置. 浮动在 CSS1 中被首次提出.浮动不完全是定位, ...
- [问题2015S08] 复旦高等代数 II(14级)每周一题(第九教学周)
[问题2015S08] 设 \(A\) 为 \(n\) 阶复方阵, 证明: \(A\overline{A}\) 与 \(\overline{A}A\) 相似, 其中 \(\overline{A}\) ...
- Python3基础 sum,range 计算1到100的和
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 第 十一 天 Flagmeng 和动画
1.flagment 的使用,生命周期. 传递数据. 2. 基本动画的使用. 3. 对话框的使用. 4.样式和主题.
- Oracle的select使用
1.select : 语法: select [distinct] {*,column [alias],...} from table 注:[]括起来的内容代表可有可无 * 代表所有列 distinct ...
- 将php网站移到CentOS 6.7上[二]:将网站部署到服务器上
首先,确保lamp环境已安装好.准备好项目源代码,数据库备份文件等.由于没有安装好VNC,因此只能用ssh部署了. 将项目源代码压缩,Linux默认是支持SFTP的,用SFTP将源代码压缩包上传到 / ...
- ElasticSearch学习问题记录——Invalid shift value in prefixCoded bytes (is encoded value really an INT?)
最近在做一个电商项目,其中商品搜索中出现一个奇怪的现象,根据某个字段排序的时候会出现商品数量减少的情况.按照一般路要么查不出来,要么正常显示,为什么增加了按照销量排序就会出现查询结果减少的情况. 查了 ...
- hdu3228Island Explorer
链接 给你两条线及两条线上的点,求最小生成树. 可以挨个枚举一条线上的点,三分出另一条线上离他最近的点进行连边. 注意N.M可能为0 debug了1天半,至今不知道原始二分版本错在哪里.. #incl ...