深入浅出 妙用Javascript中apply、call、bind
2015-10-17 09:07
387 查看
https://github.com/chokcoco/apply-call-bind/tree/master
注意apply传递的参数是数组,而call是按参数顺序传递
数组之间追加
获取数组中的最大值和最小值
验证是否是数组(前提是toString()方法没有被重写过)
类(伪)数组使用数组方法
apply、call用法的简单示例
function fruits() {} fruits.prototype = { color: "red", say: function() { console.log("My color is " + this.color); } } var apple = new fruits; apple.say(); //My color is red banana = { color: "yellow" } apple.say.call(banana); //My color is yellow apple.say.apply(banana); //My color is yellow
apply
、 call 区别
注意apply传递的参数是数组,而call是按参数顺序传递var func = function(arg1, arg2) { }; func.call(this, arg1, arg2); func.apply(this, [arg1, arg2])
apply
、 call 用法示例
数组之间追加var array1 = [12 , "foo" , {name "Joe"} , -2458]; var array2 = ["Doe" , 555 , 100]; Array.prototype.push.apply(array1, array2); /* array1 值为 [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */
获取数组中的最大值和最小值
var numbers = [5, 458 , 120 , -215 ]; var maxInNumbers = Math.max.apply(Math, numbers), //458 maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215); //458
验证是否是数组(前提是toString()方法没有被重写过)
functionisArray(obj){ returnObject.prototype.toString.call(obj) === '[object Array]' ; }
类(伪)数组使用数组方法
var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));
一道面试题目
//使用 log 代理 console.log function log(msg) { console.log(msg); } log(1); log(1,2); //优雅的方法 function log(){ console.log.apply(console, arguments); }; log(1); log(1,2); //添加一个 (app) 前缀 function log(){ var args = Array.prototype.slice.call(arguments); args.unshift('(app)'); console.log.apply(console, args); };
bind
用法简单示例
// 正常情况下使用变量保存 this 值 var foo = { bar : 1, eventBind: function(){ var _this = this ; $('.someClass').on('click',function(event) { /* Act on the event */ console.log(_this.bar); //1 }); } } // 使用 bind 进行函数绑定 var foo = { bar : 1, eventBind: function(){ $('.someClass').on('click',function(event) { /* Act on the event */ console.log(this.bar); //1 }.bind(this)); } }
varfoo = { x: 3 } var bar = function(){ console.log(this.x); } bar(); // undefined var func = bar.bind(foo); func(); // 3
apply、call、bind
比较
var obj = { x: 81, }; var foo = { getX: function() { return this.x; } } console.log(foo.getX.bind(obj)()); //81 console.log(foo.getX.call(obj)); //81 console.log(foo.getX.apply(obj)); //81
相关文章推荐
- iOS_自定义Button
- Android系统构架
- (转)Unity3D移动平台动态读取外部文件全解析
- #在蓝懿学习iOSd的日子#
- CocosFrameWork 自动引入cpp库以实现跳转查看源码
- 2012Android开发热门资料
- iOS错误——Terminal app due to uncaught exception 'NSUnknownKeyException'...this class is not key value
- Cocos Studio中声音组件(ComAudio)的获取与播放
- Vuforia 高通AR for Unity 自动聚焦
- Android View布局xml常用 属性详解
- Unity3D实现地图编辑器的插件
- Android SDK开发包国内下载地址
- cocos2d-x 调色
- Cocos2d-x利用Unity轻松快速设计复杂2D地形
- Android 触摸事件的分发与处理流程:onInterceptTouchEvent和onTouchEvent
- unity3D C#的反射使用场景
- Android Api Demos登顶之路(100)View-->AutoComplete:Contacts
- Android特效 五种Toast详解 作者:kezz 来源:安卓中文网
- Windows 7 64位机上搭建Android开发环境
- 傻瓜式操作Nagios