一、this指向构造函数实例化对象
在上篇文章中,我们提到了使用new和不使用new调用构造函数的区别,如下例:
function Benjamin(username, sex) { this.username = username; this.sex = sex; } var benjamin = new Benjamin("zuojj", "male"); //Outputs: Benjamin{sex: "male",username: "zuojj"} console.log(benjamin); var ben = Benjamin("zhangsan", "female"); //Outputs: undefined console.log(ben);
当构造函数当做普通函数被调用时,并没有返回值,同时this指向全局对象。那么我们如何来避免因为缺少new关键字,而产生的问题呢?
function Benjamin(username, sex) { //Check whether "this" is a "Benjamin" object if(this instanceof Benjamin) { this.username = username; this.sex = sex; }else { return new Benjamin(username, sex); } } var benjamin = new Benjamin("zuojj", "male"); //Outputs: Benjamin{sex: "male",username: "zuojj"} console.log(benjamin); var ben = Benjamin("zhangsan", "female"); //Outputs: Benjamin {username: "zhangsan", sex: "female"} console.log(ben);
在上例中,我们首先检查this是否是Benjammin的实例,如果不是,使用new自动调用构造函数,并实例化,这意味着,我们不再需要担心,遗漏new关键字实例化构造函数。当然这样我们可能会养成一个坏的习惯,如果避免这种现象呢?我们可以抛出一个错误,像下面这样:
function Benjamin(username, sex) { //Check whether "this" is a "Benjamin" object if(this instanceof Benjamin) { this.username = username; this.sex = sex; }else { // If not, throw error. throw new Error("`Benjamin` invoked without `new`"); } }
二、this指向调用该函数的对象
看下面的例子:
var x = 10; var obj = { x: 10, output: function() { //Outputs: true console.log(this === obj); return this.x; }, innerobj: { x: 30, output: function() { //Outputs: true console.log(this === obj.innerobj); return this.x; } } }; //Outputs: 10 console.log(obj.output()); //Outputs: 30 console.log(obj.innerobj.output());
三、this指向全局对象
在上面讨论构造函数的时候我们也讨论到不适用new的时候,this会指向全局对象,下面我们来看看两种常见的容易犯错的实例:
var x = 100; var obj = { x: 10, output: function() { (function() { //Outputs: true console.log(this === window); //Outputs: Inner: 100 console.log("Inner:" + this.x); })(); return this.x; } }; //Outputs: 10 console.log(obj.output());
在使用闭包的时候,作用域发生变化,this指向window(浏览器中)。
var x = 100; var obj = { x: 10, output: function() { return this.x; } }; var output = obj.output; //Outputs: 10 console.log(obj.output()); //Outputs: 100 console.log(output()); var obj2 = { x: 30, output: obj.output } //Outputs: 30 console.log(obj2.output());
此时this始终指向函数调用时的对象。
四、this指向apply/call()方法指派的对象
var x = 100; var obj = { x: 10, output: function() { return this.x; } }; //Outputs: 10 console.log(obj.output()); var obj2 = { x: 40, output: obj.output } //Outputs: 40 console.log(obj.output.call(obj2)); //Outputs: 10 console.log(obj2.output.apply(obj));
五、callback函数內的this指向调用该callback的函数的this所指向的对象
//<input type="text" value="3" id="txt_username"> $("#username").on("click", function() { console.log(this.value); });
六、Function.prototype.bind中的this
The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.
实例一:
function person() { return this.name; } //Function.prototype.bind var per = person.bind({ name: "zuojj" }); console.log(per); var obj = { name: "Ben", person: person, per: per }; //Outputs: Ben, zuojj console.log(obj.person(), obj.per());
实例二:
this.x = 9; var module = { x: 81, getX: function() { return this.x; } }; //Outputs: 81 console.log(module.getX()); var getX = module.getX; //Outputs: 9, because in this case, "this" refers to the global object console.log(getX); // create a new function with 'this' bound to module var boundGetX = getX.bind(module); //Outputs: 81 console.log(boundGetX());
本文向大家介绍this关键字详解,包括了this关键字详解的使用技巧和注意事项,需要的朋友参考一下 Java提供了一个this关键字,this关键字总是指向调用该方法的对象。根据this出现的位置的不同,this作为对象的默认引用有两种情形。 1)构造器中引用该构造器正在初始化的对象。 2)在方法中引用调用该方法的对象。 this关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或者实例变
本文向大家介绍详谈signed 关键字,包括了详谈signed 关键字的使用技巧和注意事项,需要的朋友参考一下 我们都知道且经常用到 unsigned 关键字,但有没有想过,与此对应的 signed 关键字有啥用? 这俩有区别吗?没区别,看起来,signed 完全是个累赘。 真的是这样吗? 我查阅了 C++11 的标准文档(草稿N3690),发现一些端倪: 3.9.1 Fundamental ty
本文向大家介绍javascript的this关键字详解,包括了javascript的this关键字详解的使用技巧和注意事项,需要的朋友参考一下 this 的定义 表示当前执行代码的环境对象 因此可将 this 的剖析分为“全局环境” 和 “函数环境” 两种类型的环境对象 全局环境 函数环境 在函数内部,this 的取值取决于函数被调用时的运行环境。 这里涉及到内存里的数据结构相关的知识点,当我们
本文向大家介绍javascript中this关键字详解,包括了javascript中this关键字详解的使用技巧和注意事项,需要的朋友参考一下 不管学习什么知识,习惯于把自己所学习的知识列成一个list,会有助于我们理清思路,是一个很好的学习方法。强烈推荐。 以下篇幅有点长,希望读者耐心阅读。 以下内容会分为如下部分: 1.涵义 1.1:this涵义 1.2:this指向的可变性 2.使用
本文向大家介绍详解java中的synchronized关键字,包括了详解java中的synchronized关键字的使用技巧和注意事项,需要的朋友参考一下 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到
本文向大家介绍Java中的关键字synchronized 详解,包括了Java中的关键字synchronized 详解的使用技巧和注意事项,需要的朋友参考一下 在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在JDK1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇介绍synchronized关键字的使用方