[Javascript] The "this" keyword
The very first thing to understand when we're talking about this-keyword is really understand what's the purpose of the this-keyword is, or why we even have this-keyword in JavaScript.
What the this-keyword allows us to do, is it allows us to reuse functions with different contexts, or in other words it allows us to decide which objects should be focal when invoking a function or a methods. Imagine we had one function, and we had a bunch of objects that had similar properties, we want that function to work throughout all of our objects.
The first thing you need to ask yourself whenever you're trying to figure out what the this-keyword is, is this question. Where is this function invoked? We won't know what the this-keyword is in a function until that function is invoked.
There are four this keyword binding:
- Implicit Binding
- Explicit Binding
- New Binding
- Window Binding
- Implicit Binding
Implicit binding says that when you call a function and when the function is invoked, look to the left of the dot, and that is what the this-keyword is going to reference.
var me = {
name: "Wan",
age: 26,
sayName: function(){
console.log(this.name);
}
}
me.sayName();
var sayNameMixin = function(obj){
obj.sayName = function(){
console.log(this.name);
}
}
var you = {
name: "Zhenitan",
age: 27
}
sayNameMixin(me);
sayNameMixin(you);
me.sayName(); //wan
you.sayName(); //Zhentian
var Person = function(name, age){
return {
name: name,
age: age,
sayName: function(){
console.log(this.name);
},
mother: {
name: "Yun",
sayName: function(){
console.log(this.name);
}
}
}
}
var jim = Person('Jim', 42);
jim.sayNmae(); // Jim
jim.mother.sayNmae(); //Yun
you're going to find that whenever you get in these situation of trying to figure out what the this-keyword is, the very first thing you should do is look at when the function was invoked, and look if there's anything to the left of the dot, because if there is, that's what this-keyword is referencing.
- Explicit Binding
.call()
What if we were to take SayName out of this function? Instead of being a method on the object, now, it's just a function currently on the global scope. Now, what we want to do is we want to somehow call this function in the context of wan. What we can do is if we type the function name, every function has a .call property that allows us to do just that.
var sayName = function(){
console.log(this.name);
}
var wan = {
name: "Wan",
age: 27
};
sayName.call(wan);
let's go ahead and say if we wanted to pass a parameter, pass a few more arguments to SayName, what we can do is, let's say we had an array of languages.
var sayName = function(lang1, lang2, lang3){
console.log("My name is "+ this.name + ', and I know' + lang1 + ', '+ lang2 + ', '+ lang3);
}
var wan = {
name: "Wan",
age: 27
};
var languages = ['Javascript', 'Ruby', 'Python'];
sayName.call(wan, languages[0], languages[1], languages[2]);
What we can do here in .call, the very first argument you pass is the context, and every argument after that is going to be passed to the function, just as a normal argument.
.apply()
It would be nicer if we could just pass in languages, and some feature in the language of JavaScript would be able to parse these out to us.
var sayName = function(lang1, lang2, lang3){
console.log("My name is "+ this.name + ', and I know' + lang1 + ', '+ lang2 + ', '+ lang3);
}
var wan = {
name: "Wan",
age: 27
};
var languages = ['Javascript', 'Ruby', 'Python'];
sayName.apply(wan, languages);
.bind()
.bind is almost the exact same thing as .call, except there's one thing that's different. It returns a new function.
var sayName = function(lang1, lang2, lang3){
console.log("My name is "+ this.name + ', and I know' + lang1 + ', '+ lang2 + ', '+ lang3);
}
var wan = {
name: "Wan",
age: 27
};
var languages = ['Javascript', 'Ruby', 'Python'];
var newFn = sayName.bind(wan, languages[0],languages[1],languages[2]);
newFn();
To reacp, .call, apply and bind allow us to specifically state what this keyword will be within any given function. .call and .apply behave the same way, they will immediatelyh invoke that funciton, but with .call, you pass in arguments one by one, and with .apply, you pass them in as an array. .bind is the exact same thing as .call, but execpt for immediately invoking the function, it's going to return you a brand new function that you can invoke later.
- New Binding
var Animal = function(name, age){
// this = {};
this.name = name;
this.age = age;
};
var dog = new Animal('Zippy', 3);
When you use 'new' keyword, Javascript will auto create a 'this' keyword and assgin it as an object.
- Window Binding
var greeting = function(){
console.log(this.message);
}
greeting(); //undefined
window.message = "Hello";
greeting(); //"Hello"
In the console, we want to log out 'this.message', but we didn't use implict binding, so it shows undefined.
In javascript, if none of above three methods applyed, 'this' keyword will refer to the 'window' object, so if we assign
window.message = "Hello"
in greeting() will log out Hello.
To recap all our rules, we have implicit binding, which is you look to the left of the dot, at call time, explicit binding, which is telling a function what the context of the this keyword is going to be using call, apply, or bind.
The new binding is whenever you have a function invoked with the new keyword, the this keyword is bound to the new object being constructed. Then the Window binding where if none of these rules apply, then the this keyword is going to default to the Window object unless you're in strict mode. Then it's just going to be undefined.
[Javascript] The "this" keyword的更多相关文章
- javascript实例备忘
一,javascript动态显示: 如显示效果上图所示: 如图显示鼠标放在百度谷歌等字样上市动态显示其内容明细:代码如下:<head><title></title> ...
- Javascript的实例化与继承:请停止使用new关键字
本文同时也发表在我另一篇独立博客 <Javascript的实例化与继承:请停止使用new关键字>(管理员请注意!这两个都是我自己的原创博客!不要踢出首页!不是转载!已经误会三次了!) 标题 ...
- 我希望我知道的七个JavaScript技巧
如果你是一个JavaScript新手或仅仅最近才在你的开发工作中接触它,你可能感到沮丧.所有的语言都有自己的怪癖(quirks)——但从基于强类型的服务器端语言转移过来的开发人员可能会感到困惑.我就曾 ...
- Javascript + Dom知识点总结
Javascript + Dom知识点总结 1.用Javascript声明数组和字典的方式 // 数组声明 var arr = new Array(); arr["0"] = &q ...
- JavaScript Interview Questions: Event Delegation and This
David Posin helps you land that next programming position by understanding important JavaScript fund ...
- javascript fundamental concept
http://hzjavaeyer.group.iteye.com/group/wiki?category_id=283 上面这个url非常适合javascript初学者阅读,感谢原作者的分享 什么是 ...
- [转]JavaScript的实例化与继承:请停止使用new关键字
JavaScript中的new关键字可以实现实例化和继承的工作,但个人认为使用new关键字并非是最佳的实践,还可以有更友好一些的实现.本文将介绍使用new关键字有什么问题,然后介绍如何对与new相关联 ...
- Understand JavaScript’s “this” With Clarity, and Master It
The this keyword in JavaScript confuses new and seasoned JavaScript developers alike. This article a ...
- [ javascript ] getElementsByClassName与className和getAttribute!
对于javascript中的getElementsByClassName 在IE 6/7/8 不支持问题. 那么须要模拟出getElementsByClassName 须要採用className属性 ...
随机推荐
- 表单验证代码实例:jquery.validate.js表单验证插件
jquery.validate.js是JQuery旗下的一个验证插件,借助JQuery的优势,我们可以迅速验证一些常见的输入,并且可以自己扩充自己的验证方法.使用前请先下载必要的JQuery插件:jq ...
- Nginx学习笔记(四) 源码分析&socket/UDP/shmem
源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_socket.h&Ngx_s ...
- iOS——Command-Line 查看当前SDK版本并修改默认SDK版本
在工作中可能会碰到用命令行编译.打包iOS应用程序的情况(xcodebuild相关命令). 但是由于SDK版本问题,会报错,说某SDK版本不对,可能是因为升级Xcode导致的SDK版本升级,为了避免高 ...
- 单线程&浏览器多线程
知乎答案:http://www.zhihu.com/question/31982417/answer/54136684 copy大牛的好文:from http://www.cnblogs.com/Ma ...
- 易出错的C语言题目之一:宏定义与预处理
1.写出下列代码的运行结果: #include<stdio.h> #include<string.h> #define STRCPY(a,b) strcpy(a##_p,#b) ...
- asp.net datatable 导出为 txt
如下是导出到TXT的方法 public static void ToTxt(DataTable dv, string FileName) { System.IO.StringWriter sw = n ...
- 看大众点评V9新版如何为O2O止血 带领行业下半场回归理性
前不久,美团点评CEO王兴提出的“中国互联网进入下半场”观点一直在持续发酵,并引发了整个互联网圈对于进入下半场该如何改革,如何迎战的深刻反思.在互联网的上半场,大家依托的是人口红利,但是到了下半场,用 ...
- 解决JS传参中文乱码
function PopupFK(cNum,type){ var url = "contract!Paying.action"; url = url + "?contra ...
- Memcached常规应用与分布式部署方案
1.Memcached常规应用 $mc = new Memcache(); $mc->conncet('127.0.0.1', 11211); $sql = sprintf("SELE ...
- raspberry pi 如何汉化显示中文
1 树莓派初装系统之后,首次启动会出现“raspi-config”工具,如下图:(若不是初次启动,在命令模式下,请输入 sudo raspi-config 命令,即可调出此界面.若在图形桌面下,打开桌 ...