[JS] Topic - hijack this by "apply" and "call"
Ref: 详解js中的apply与call的用法
call 和 apply二者的作用完全一样,只是接受参数的方式不太一样。
参数形式:
Function.apply(obj,args) call方法与apply方法的第一个参数是一样的,只不过第二个参数是一个参数列表
非严格模式下的第一个参数:
var test = function(){
console.log(this===window);
} // this会指向默认的宿主对象,在浏览器中则是window
test.apply(null);//true
test.call(undefined);//true
一般的用法:
"劫持"别人的方法
var foo = {
name:"mingming",
logName:function(){
console.log(this.name);
}
}
var bar={
name:"xiaowang"
}; /**
* bar挟持foo的方法logName
*/
foo.logName.call(bar);//xiaowang
实现继承
function Animal(name){
this.name = name;
this.showName = function(){
console.log(this.name);
}
} function Cat(name){
/**
* this(Cat)挟持Animal的属性name
*/
Animal.call(this, name);
} var cat = new Cat("Black Cat");
cat.showName(); //Black Cat
在实际开发中,经常会遇到this指向被不经意改变的场景。
(1) 有一个局部的fun方法,fun被作为普通函数调用时,fun内部的this指向了window,但我们往往是想让它指向该#test节点,见如下代码:
window.id="window";
document.querySelector('#test').onclick = function(){
console.log(this.id);//test
var fun = function() {
console.log(this.id);
}
fun();//window
}
(2) 使用call,apply我们就可以轻松的解决这种问题了
window.id="window";
document.querySelector('#test').onclick = function(){
console.log(this.id);//test
var fun = function(){
console.log(this.id);
}
fun.call(this);//test
}
(3) 通过中间变量的技巧:
window.id="window";
document.querySelector('#test').onclick = function(){
var that = this;
console.log(this.id);//test
var fun = function(){
console.log(that.id);
}
fun();//test
}
类数组:
例如: arguments, NodeList
1.具有length属性
2.按索引方式存储数据
3.不具有数组的push, pop等方法
Array.prototype.push
页可以实现两个数组合并
(function() {
Array.prototype.push.call(arguments, 4); // 往arguments中push一个4进去了
console.log(arguments);//[1, 2, 3, 4]
})(1,2,3)
- 使用apply,支持数组:
var arr1=new Array("1","2","3");
var arr2=new Array("4","5","6"); // arr1调用了push方法,参数是通过apply将数组装换为参数列表的集合.
Array.prototype.push.apply(arr1, arr2);
console.log(arr1);//["1", "2", "3", "4", "5", "6"]
求类数组中的最大值:
(function(){
var maxNum = Math.max.apply(null, arguments);
console.log(maxNum);//
})(34,2,56);
判断类型:
console.log(Object.prototype.toString.call(123)) //[object Number]
console.log(Object.prototype.toString.call('123')) //[object String]
console.log(Object.prototype.toString.call(undefined)) //[object Undefined]
console.log(Object.prototype.toString.call(true)) //[object Boolean]
console.log(Object.prototype.toString.call({})) //[object Object]
console.log(Object.prototype.toString.call([])) //[object Array]
console.log(Object.prototype.toString.call(function(){})) //[object Function]
[JS] Topic - hijack this by "apply" and "call"的更多相关文章
- [JS] Topic - why "strict mode" here
Ref: Javascript 严格模式详解 使得Javascript在更严格的条件下运行: - 消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; - 消除代码运行的一些不安全 ...
- JS中的call()和apply()方法(转)
转自:http://uule.iteye.com/blog/1158829 JS中的call()和apply()方法 博客分类: JS 1.方法定义 call方法: 语法:call([thisOb ...
- js笔记——理解js中的call及apply
call及apply在js里经常碰得到,但一直感觉很陌生,不能熟练使用.怎样才能熟练应用呢? 为什么存在call和apply? 在javascript OOP中,我们经常会这样定义: function ...
- JS中的call、apply、bind方法
JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]] ...
- 关于 js 中的 call 和 apply使用理解
关于 js 中的 call 和 apply使用理解 在学习新的东西时候,碰到以前看过而又不理解,或则记忆不深的地方不妨回头看看书里知识点,有助于加深理解.正所谓--温故而知新. 废话不多说,直接上代码 ...
- 快速理解js中的call,apply的作用
今天被人问到js中的call,apply的区别和用途,解释了一番后,想到之前在逼乎上看到一位小伙伴生动形象的解释 本身不难理解,看下MDN就知道了,但是不常用,遇到了,还要脑回路回转下.或者时间长了, ...
- JS中的call()和apply()方法
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- js中的this和apply
this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 1.纯粹函数调用. function test() { this. ...
- js中的call()与apply()
js中的call()函数和apply()函数: 1.主要作用:是用于指定作用域和传参 (1)用于指定作用域 window.color = "red"; var o = { colo ...
随机推荐
- wordpress:搭建个人博客
如果是自己玩可以使用虚拟机练习一下,想放到线上就买台服务器 安装Mysql 新买的云服务器,需要检测系统是否自带安装mysql yum list installed | grep mysql 如果发现 ...
- window 7喇叭有红叉,耳机扬声器已拔出驱动无法修复
win7系统没声音前提是声卡驱动已经安装完全,且没有问题.Windows 7系统电脑有耳机的存在,但是还是显示扬声器耳机或耳机已拔出 ,未修复故障,首先可以百度下看下其他教程,尝试过还是不行的时候,可 ...
- UITableView滚动优化(RunLoop)
链接: 利用RunLoop优化tableView RunLoop方式优化加载tableview RunLoop总结:RunLoop的应用场景(三)滚动视图流畅性优化 TableView加载图片的优化逻 ...
- [Go] 开发 go web 项目,踩到的一些“坑”
注意:这些“坑”不是bug,只是自己当时没搞明白. 用到的框架为 Beego 1.字典 map 是“引用类型”,本身就是指针,作为参数传递时,直接传 map 变量名即可(不要传 map 变量指针). ...
- linux命令行下修改系统时间、时区
date查看时间以及时区 图a是est时区,和HONGkong时间查了一个小时. # 保存设置$ sudo mv /etc/localtime /etc/localtime.old # 设置时区 $ ...
- MySQL报1130错误解决办法
update user set password_expired='N' where host = '127.0.0.1'; update user set password=password('ro ...
- 关于three.js中添加文字的方式[转]
https://blog.csdn.net/qq563969790/article/details/76584976 网上资料大部分是通过引入外部font库进行文字效果的载入,但是在实际运行的时候发现 ...
- hive中 regexp_replace的用法,替换特殊字符问题
数据仓库中有的字段不合格,有特殊字符,比如换行符. poi_name \n19013 \n12013 怎么把换行符替换掉呢? https://cwiki.apache.org/confluence/d ...
- 使用 BeautifulSoup 进行解析 html
#coding=utf-8 import urllib2 import socket import httplib from bs4 import BeautifulSoup UserAgen ...
- MDX Cookbook 07 - 在不同层次结构的成员中实现 逻辑 OR 的效果
第一个示例:查看所有包括黑色产品的子目录产品中的 Reseller Order Quantity 和 Reseller Order Count. 第二个示例:和第一个示例查询结构一样,只是筛选的是大小 ...