JavaScript 是一种脚本语言,因此被很多人认为是简单易学的。然而情况恰恰相反,JavaScript 支持函数式编程、闭包、基于原型的继承等高级功能。本文仅采撷其中的一例:JavaScript 中的 this 关键字,深入浅出的分析其在不同情况下的含义,形成这种情况的原因以及 Dojo 等 JavaScript 工具中提供的绑定 this 的方法。可以这样说,正确掌握了 JavaScript 中的 this 关键字,才算迈入了 JavaScript 这门语言的门槛。
至于js中this这个东西,好多淫解释过了,看起来好高端的样子,不晓得你看懂了木有?
先引用比较高端的,小牛知识库里 的, yes this
好了,下面加上鄙人比较挫的解释
论点: this 不是变量,不是属性,不能为其赋值,它始终指向调用它的对象
感觉还TM太虚了,只要记住最重要的一条即可 ”它始终指向调用它的对象“ ,所以找到调用this的对象,就知道this到底指向谁了
1、
alert(this);
瞅瞅,弹出来的是么子,要么是”object window“ ,要么 "object" 总之就对象了,是那个对象呢?
alert(this === window);
结果为'true' 所以了,现在调用它的对象是window了
2、
var test = function(){ alert(this); } test();
猜猜上面弹出什么,是不是和"alert(this)" 这句一样的
var test = function(){ alert(this === window); } test();
运行上面的代码,是不是弹出了'true' ?
事情就这样完了?
要这么简单的话,何必那么多人都去论述这个鸟了?
3、
再来
var test = function(){ alert(this === window); } new test();
哎哎,这次咋成'false'呢?
记住”this 始终指向调用它的对象“,第”1、“处调用该段代码的直接对象是全局对象,即"window" ;第”2、“处虽然是函数,但是调用其的仍然是”window“(不要弄混了,函数虽然是对象,但是调用它的是另一个对象);第”3、“处,使用了”new“ 这时其实已经发生变化了,这是一个构造函数,构造函数创建时创建了一个新的空的对象,即”new test()“创建了一个新的对象,然后再由这个对象指向函数"test"中的代码,因此此时this不在是window对象,而是该构造函数创建的新对象。
4、
var test ={ 'a':1, 'b':function(){ alert(this === test) } } test.b();
有了上面的论点,这下一下子清楚了吧!
5、
var test ={ 'a':1, 'b':function(){ alert(this === test) } } var test1 = test; test1.b();
so, 你不会认为结果为"false"吧,错了,虽然'test1'的值为'test' 但是'test1'不还是'test'对象么,它有新产生对象,你暂且理解为引用的了,两个都指向一个对象,奉上下面一段代码为证
var test ={ 'a':1, 'b':function(){ alert(this === test) } } var test1 = test; test.a = 2; alert(test1.a);
如果弹出了”1“,你来骂我
6、再整个复杂的
var test ={ 'a':1, 'b':{ 'b1':function(){ alert(this === test); } } } test.b.b1();
这是"true"还是"false"呢?
按照上面的理论,这时"this"不再直接被'test'调用了,而是被'test.b' 调用, 奉上下面一段代码为证
var test ={ 'a':1, 'b':{ 'b1':function(){ alert(this === test.b); } } } test.b.b1();
7、好再整个复杂点的
var test = function(){ var innerTest = function(){ alert(this === test); } innerTest(); } test();
你不会认为弹出"true"吧,不是按照上面的理论'innerTest'是被'test'调用的,然后'this'就指向'test'吗?
额,错就错在是谁调用的'innerTest', 其实这种函数都是'window'对象调用的,及时你嵌套一千层,调用各个函数的都是'window'对象,奉上下面这段代码为证
var test = function(){ var innerTest = function(){ alert(this === window); var innerTest1 = function(){ alert(this === window); } innerTest1(); } innerTest(); } test();
8、再来一段特殊的
var test = function(){ alert(this === window); } var test1 = { } test.apply(test1);
这个我觉得大家都不会猜错,该函数的作用就是”调用一个对象的一个方法,以另一个对象替换当前对象“ 所以了'window' 对象已经被替代为'test1',自然为'false'了,奉上如下代码以为证明
var test = function(){ alert(this === test1); } var test1 = { } test.apply(test1);
那么诸如'call'之类的也就相似了
9、再来一个原型的继承,区别于字面量的继承
var test = function(){ } var my = function(){ this.a = function(){ alert(this === mytest2); } } var mytest = new my(); test.prototype = mytest; var mytest2 = new test(); mytest2.a();
10、还剩下些什么了,可能就是'dom'对象了
<script> var mytest = function(context){ alert(context.getAttribute('id')); alert(this === window); } </script> <div id="test" onclick="mytest(this)">aaaa</div>
看了上面的应该了解了吧,里面的'this'分别代表神马
介绍 在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节。讨论的主题就是this关键字。实践证明,这个主题很难,在不同执行上下文中this的确定经常会发生问题。 许多程序员习惯的认为,在程序语言中,this关键字与面向对象程序开发紧密相关,其完全指向由构造器新创建的对象。在ECMAScript规范中也是这样实现的,但正如我们将看到那样,在ECMAScript中,this并不限于只用来指向新创建
问题内容: 我开始阅读JavaScript模式,一些代码使我感到困惑。 这是我的问题: Q1: ? 为什么以及如何运作? Q2:为什么不只是 要么 问题答案: 与plain old 之间的区别在于,前者是一个 值 ,后者是一个左值。如果它是其他一些标识符,则将更加明显: 那是一个产生(只是说或会)的表达式,但不是对的引用。 你为什么在乎? 好了,规范了Ecma认为一个 参考 ,以成为一个“直接的e
本文向大家介绍详谈jQuery中的this和$(this),包括了详谈jQuery中的this和$(this)的使用技巧和注意事项,需要的朋友参考一下 网上有很多关于jQuery的this和$(this)的介绍,大多数只是理清了this和$(this)的指向,其实它是有应用场所的,不能一概而论在jQuery调用成员函数时,this就是指向dom对象。 $(this)指向jQuery对象是无可厚非的
问题内容: 我目前正在研究jQuery 对于以下两个示例: 请注意,在第一个示例中,我们用于在每个元素内附加一些文本。在第二个示例中,我们在重置表单时直接使用。 似乎比经常使用。 我的猜测是,在第一个示例中,是将每个元素转换为可以理解功能的jQuery对象,而在第二个示例中,可以直接在表单上调用它。 基本上,我们需要特殊的仅jQuery功能。 这个对吗? 问题答案: 是的,只有在使用jQuery
本文向大家介绍vue中全局路由守卫中替代this操作(this.$store/this.$vux),包括了vue中全局路由守卫中替代this操作(this.$store/this.$vux)的使用技巧和注意事项,需要的朋友参考一下 全局路由守卫this.$vux.loading.hide()报错,访问不到this 解决办法 申明变量代替this main.js文件方法 if判断防止第一次初始化报错
本文向大家介绍JavaScript中this详解,包括了JavaScript中this详解的使用技巧和注意事项,需要的朋友参考一下 都说 JavaScript 是一种很灵活的语言,这其实也可以说它是一个混乱的语言。它把函数式编程和面向对象编程糅合一起,再加上动态语言特性,简直强大无比(其实是不能和C++比的,^_^ )。 这里的主题是 this ,不扯远了。this 本身原本很简单,总是指向类的当