javaScript中的this示例学习详解及工作原理


Posted in Javascript onJanuary 13, 2014

this的工作原理

如果一个函数被作为一个对象的方法调用,那么this将被指派为这个对象。

var parent = {
    method: function () {
        console.log(this);
    }
};parent.method();
// <- parent

注意这种行为非常“脆弱”,如果你获取一个方法的引用并且调用,那么this的值不会是parent了,而是window全局对象。这让大多数开发者迷惑。

ThisClownCar();
// <- Window
 

改动this

.call、 .apply 和.bind 方法用来操作调用函数的方式,帮我们定义this的值和传递给函数的参数值。

Function.prototype.call 可以有任意数量的参数,第一个参数被分配给this,剩下的被传递给调用函数。

Array.prototype.slice.call([1, 2, 3], 1, 2)
// <- [2]Function.prototype.apply 的行为和.call类似,但它传递给函数的参数是一个数组,而不是任意参数。
String.prototype.split.apply('13.12.02', ['.'])
// <- ['13', '12', '02']
 

Function.prototype.bind 创建一个特殊的函数,该函数将永远使用传递给.bind的参数作为this的值,以及能够分配部分参数,创建原函数的珂里化(curride)版本。

 

var arr = [1, 2];
var add = Array.prototype.push.bind(arr, 3);// effectively the same as arr.push(3)
add();
// effectively the same as arr.push(3, 4)
add(4);
console.log(arr);
// <- [1, 2, 3, 3, 4]

作用域链中的this

在下面的例子,this将无法在作用域链中保持不变。这是规则的缺陷,并且常常会给业余开发者带来困惑。

function scoping () {
  console.log(this);  return function () {
    console.log(this);
  };
}
scoping()();
// <- Window
// <- Window

有一个常见的方法,创建一个局部变量保持对this的引用,并且在子作用域中不能有同命变量。子作用域中的同名变量将覆盖父作用域中对this的引用。http://www.cnblogs.com/sosoft/

function retaining () {
  var self = this;  return function () {
    console.log(self);
  };
}
retaining()();
// <- Window
 

除非你真的想同时使用父作用域的this,以及当前this值,由于某些莫名其妙的原因,我更喜欢是使用的方法.bind函数。这可以用来将父作用域的this指定给子作用域。

 

function bound () {
  return function () {
    console.log(this);
  }.bind(this);
}bound()();
// <- Window
Javascript 相关文章推荐
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
Apr 07 Javascript
javascript里模拟sleep(两种实现方式)
Jan 25 Javascript
JS实现选择TextArea内文本的方法
Aug 03 Javascript
node.js回调函数之阻塞调用与非阻塞调用
Nov 13 Javascript
AngularJS仿苹果滑屏删除控件
Jan 18 Javascript
jQuery实现内容定时切换效果完整实例
Apr 06 Javascript
Javascript动画效果(2)
Oct 11 Javascript
JS打开摄像头并截图上传示例
Feb 18 Javascript
详解小程序不同页面之间通讯的解决方案
Nov 23 Javascript
React性能优化系列之减少props改变的实现方法
Jan 17 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 jQuery
微信小程序自定义模态弹窗组件详解
Dec 24 Javascript
JS 日期比较大小的简单实例
Jan 13 #Javascript
JS之Date对象和获取系统当前时间详解
Jan 13 #Javascript
JS OffsetParent属性深入解析
Jan 13 #Javascript
JavaScript网页定位详解
Jan 13 #Javascript
js菜单点击显示或隐藏效果的简单实例
Jan 13 #Javascript
ie8本地图片上传预览示例代码
Jan 12 #Javascript
js 立即调用的函数表达式如何写
Jan 12 #Javascript
You might like
PHP文件上传主要代码讲解
2013/09/30 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
PHP 实现判断用户是否手机访问
2015/01/21 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
js类式继承的具体实现方法
2013/12/31 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
基于JS对象创建常用方式及原理分析
2017/06/28 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
浅谈如何通过node.js对数据进行MD5加密
2018/05/16 Javascript
Vue.js 事件修饰符的使用教程
2018/11/01 Javascript
vue 移动端适配方案详解
2018/11/15 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
Python多线程学习资料
2012/12/19 Python
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
关于Python数据结构中字典的心得
2017/12/04 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
AmazeUI 导航条的实现示例
2020/08/14 HTML / CSS
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
企业管理部经理岗位职责
2013/12/24 职场文书
小学生评语大全
2014/04/18 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
个人委托书如何写
2014/09/25 职场文书
入党积极分子培养人意见
2015/06/02 职场文书
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL