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 相关文章推荐
jquery入门—数据删除与隔行变色以及图片预览
Jan 07 Javascript
使用JavaScript 实现各种跨域的方法
May 08 Javascript
JS正则验证邮箱的格式详细介绍
Nov 19 Javascript
JS随机调用指定函数的方法
Jul 01 Javascript
关于js里的this关键字的理解
Aug 17 Javascript
jQuery删除节点用法示例(remove方法)
Sep 08 Javascript
正则表达式,替换所有HTML标签的简单实例
Nov 28 Javascript
彻底学会Angular.js中的transclusion
Mar 12 Javascript
详解vue slot插槽的使用方法
Jun 13 Javascript
基于jquery实现五星好评
Nov 18 jQuery
使用vue2实现带地区编号和名称的省市县三级联动效果
Nov 05 Javascript
教你完全理解ReentrantLock重入锁
Jun 03 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遍历数组的方法分享
2012/03/22 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
Ajax+PHP实现的模拟进度条功能示例
2019/02/11 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
[JS]点出统计器
2020/10/11 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
2017/02/21 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
2018/01/31 Javascript
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现将内容分行输出
2015/11/05 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
阿尔卡特(中国)的面试题目
2014/08/20 面试题
UNIX命令速查表
2012/03/10 面试题
教师学习培训邀请函
2014/02/04 职场文书
运动员口号
2014/06/09 职场文书
自主招生英文自荐信
2015/03/25 职场文书
紧急通知
2015/04/17 职场文书
借款民事起诉状范文
2015/05/19 职场文书
2016年春季开学典礼新闻稿
2015/11/25 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis