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 相关文章推荐
JS简单实现文件上传实例代码(无需插件)
Nov 15 Javascript
jQuery获取Radio,CheckBox选择的Value值(示例代码)
Dec 12 Javascript
jQuery入门基础知识学习指南
Aug 14 Javascript
详解AngularJS控制器的使用
Mar 09 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
Feb 20 Javascript
非常实用的vue导航钩子
Mar 20 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
Jun 08 Javascript
bootstrap模态框关闭后清除模态框的数据方法
Aug 10 Javascript
Electron-vue脚手架改造vue项目的方法
Oct 22 Javascript
浅谈Webpack多页应用HMR卡住问题
Apr 24 Javascript
vue学习之Vue-Router用法实例分析
Jan 06 Javascript
在VUE中使用lodash的debounce和throttle操作
Nov 09 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
使用数据库保存session的方法
2006/10/09 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
2011/12/20 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
transport.js和jquery冲突问题的解决方法
2015/02/10 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
2017/05/25 Javascript
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
基于Python代码编辑器的选用(详解)
2017/09/13 Python
python的格式化输出(format,%)实例详解
2018/06/01 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
python读取并写入mat文件的方法
2019/07/12 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
python实现凯撒密码、凯撒加解密算法
2020/06/11 Python
matplotlib基础绘图命令之imshow的使用
2020/08/13 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
2021/01/13 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
html5唤醒APP小记
2019/03/27 HTML / CSS
求职简历自荐信
2013/10/20 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
浅谈golang package中init方法的多处定义及运行顺序问题
2021/05/06 Golang
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
oracle数据库去除重复数据
2022/05/20 Oracle
HttpClient实现文件上传功能
2022/08/14 Java/Android