关于JavaScript中这种用法的学习笔记
JavaScript中有三个最容易混淆的地方,闭包、this和prototype。对于大多数人来说,我们可以用词法范围来避免这个坑,但是我们不能一直生活在一个舒适的区域。敢于打破砂锅问到底,对我们来说也是一种进步。
一、对这个关键词的一般误解:
1.这指向函数本身
2.这指向函数的词法范围
我们可以查看以下代码:
函数test(){ test . a=1;this . a=2;console . log(test . a);console . log(this . a);console . log(test . a===this . a);} test();console.dir(测试);在上面的代码中,我们全局声明了一个方法测试,给测试中的A属性赋值1,给当前方法中的A属性赋值2,加上这个指向函数本身,这样test.a===this,A和两者都等于2。
让我们看看这段代码的运行结果:
从上面可以看出,scopes是全局范围窗口,这也指向这里。虽然函数本身是一个对象,但这并不指向这里。
我们必须记住的一点是,这是在运行时绑定的,而不是在写入时绑定的,它的上下文取决于调用函数时的各种条件。这个的绑定与函数声明的位置无关,只取决于函数的调用方式。
由于这是在运行时绑定的,有什么方法可以改变这种绑定,使它不指向窗口,而是指向方法测试?答案是肯定的,我们可以通过一些强制绑定的方法来改变这个方向,比如调用、应用、绑定,我们可以把代码改成如下的方式:
函数test(){ test . a=1;this . a=2;console . log(test . a);console . log(this . a);console . log(test . a===this . a);} test . call(test);console.dir(测试);运行结果如下:
接下来,让我们看看这是否指向函数的词法范围。这里有一个有趣的代码:
函数parent(){ var a=2;function child(){ console . log(this . a)} child();} parent();如果这指向函数的词法范围,那么子方法中的this.a应该存在,实际执行结果如下:
事实上,在JavaScript中,范围确实与对象相似,可见的标识符就是它的属性。但是,作用域“对象”不能被JavaScript代码访问,它存在于JavaScript引擎内部。所以每当你想把这个和词汇范围的搜索混为一谈时,你必须提醒自己这是不可能的。
第二,这方面的约束规则
这方面的约束规则大致可以分为以下几类:
2.1默认绑定
2.2隐式绑定
2.3显式绑定
2.4新绑定
2.1默认绑定
在上面的例子中,这指向窗口,它们都有一个共同的特征。它们由函数引用调用,无需任何修改,因此它们只能使用默认绑定,不能应用其他规则
2.2隐式绑定
隐式绑定要考虑的第一个规则是在调用位置是否有上下文对象,或者它是否由对象拥有或包含,例如:
在这种情况下,这指的是对象obj。还有类似于一些DOM事件的绑定,document.getelementbyid ('XXX ')。addeventlistener ('click ',function(){ XXX });回调方法中的这个指向选择器选择的元素。在这种情况下,可以简单地理解为这指向调用方法前面的对象。
2.3显式绑定
显示绑定在开发过程中被广泛使用。借助这些显式绑定方法,可以直接改变当前方法的这一点,使得js语言非常灵活。调用、应用和绑定主要有三种,基本用法如下:
function sum(){ console . log(this . a this . b);} var obj1={ a: 1,b : 2 };var test=sum . bind(obj 1);sum . call(obj 1);//3 sum . apply(obj 1);//3 test();//3注意事项:
调用apply的第一个参数接受这个对象,调用的第二个参数可以接受字符串形式的参数,apply接受类数组/数组参数
当null || undefined作为此的绑定对象传递到call/apply/bind中时,这些值将在调用时被忽略,并且默认绑定规则将被实际应用
2.4新绑定
JavaScript语言中的新运算符不同于其他面向对象语言中的新运算符,因为JavaScript中没有对象的概念。所有的函数都可以用new来调用,也叫构造函数调用。在构造函数调用期间,将自动执行以下操作。
1.创造一个全新的物体
2.此对象将由[[原型]]连接
3.这个新对象将绑定到这个函数调用
4.如果函数不返回其他对象,新表达式中的函数调用将自动返回这个新对象
构造函数也是js中常见的设计模式,例如下面的代码:
功能测试(a,b){ this . a=a;this.b=bthis.add=function() {调试器;console . log(this . a this . b);} } var cc=新测试(1,2);cc . add();console . log(cc);在调用new的过程中,会返回一个新的对象,这个对象的这个指向Test;
版权声明:关于JavaScript中这种用法的学习笔记是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。