个人网站推广方案,网站设计一般多长时间,网页编程用什么语言,建设好网站能赚到钱吗一、this到底指向什么呢#xff1f;
我们先说一个最简单的#xff0c;this在全局作用域下指向什么#xff1f;
这个问题非常容易回答#xff0c;在浏览器中测试就是指向window
但是#xff0c;开发中很少直接在全局作用于下去使用this#xff0c;通常都是在函数中使用…一、this到底指向什么呢
我们先说一个最简单的this在全局作用域下指向什么
这个问题非常容易回答在浏览器中测试就是指向window
但是开发中很少直接在全局作用于下去使用this通常都是在函数中使用。
所有的函数在被调用时都会创建一个执行上下文这个上下文中记录着函数的调用栈、AO对象等this也是其中的一条记录
定义一个函数我们采用三种不同的方式对它进行调用它产生了三种不同的结果
这个的案例可以给我们什么样的启示呢
函数在调用时JavaScript会默认给this绑定一个值this的绑定和定义的位置编写的位置没有关系this的绑定和调用方式以及调用的位置有关系this是在运行时被绑定的
this到底是怎么样的绑定规则呢
绑定一默认绑定绑定二隐式绑定绑定三显示绑定绑定四new绑定
二、规则一默认绑定
什么情况下使用默认绑定呢独立函数调用。
独立的函数调用我们可以理解成函数没有被绑定到某个对象上进行调用 三、规则二隐式绑定
另外一种比较常见的调用方式是通过某个对象进行调用的
也就是它的调用位置中是通过某个对象发起的函数调用。 四、规则三显示绑定 隐式绑定有一个前提条件 必须在调用的对象内部有一个对函数的引用比如一个属性如果没有这样的引用在进行调用时会报找不到该函数的错误正是通过这个引用间接的将this绑定到了这个对象上 如果我们不希望在 对象内部 包含这个函数的引用同时又希望在这个对象上进行强制调用该怎么做呢
JavaScript所有的函数都可以使用call和apply方法这个和Prototype有关。 call和apply方法的区别其实非常简单第一个参数是相同的后面的参数apply为数组call为参数列表这两个函数的第一个参数都要求是一个对象这个对象的作用是什么呢就是给this准备的。在调用这个函数时会将this绑定到这个传入的对象上。因为上面的过程我们明确的绑定了this指向的对象所以称之为 显示绑定。
通过call或者apply绑定this对象 如果我们希望一个函数总是显示的绑定到一个对象上可以怎么做呢
五、内置函数的绑定思考
有些时候我们会调用一些JavaScript的内置函数或者一些第三方库中的内置函数。
这些内置函数会要求我们传入另外一个函数我们自己并不会显示的调用这些函数而且JavaScript内部或者第三方库内部会帮助我们执行这些函数中的this又是如何绑定的呢
setTimeout、数组的forEach、div的点击 注意forEach()第二个参数可以绑定this
六、规则四new绑定 七、规则优先级 学习了四条规则接下来开发中我们只需要去查找函数的调用应用了哪条规则即可但是如果一个函数调用位置应用了多条规则优先级谁更高呢 1.默认规则的优先级最低
毫无疑问默认规则的优先级是最低的因为存在其他规则时就会通过其他规则的方式来绑定this
2.显示绑定优先级高于隐式绑定
3.new绑定优先级高于隐式绑定
4.new绑定优先级高于bind
new绑定和call、apply是不允许同时使用的所以不存在谁的优先级更高new绑定可以和bind一起使用new绑定优先级更高
八、this规则之外 – 忽略显示绑定 我们讲到的规则已经足以应付平时的开发但是总有一些语法超出了我们的规则之外。神话故事和动漫中总是有类似这样的人物 如果在显示绑定中我们传入一个null或者undefined那么这个显示绑定会被忽略使用默认规则
九、this规则之外 - 间接函数引用
另外一种情况创建一个函数的 间接引用这种情况使用默认绑定规则。
赋值表达式(obj2.foo obj1.foo)的结果是foo函数foo函数被直接调用那么是默认绑定
十、箭头函数 arrow function
箭头函数是ES6之后增加的一种编写函数的方法并且它比函数表达式要更加简洁
箭头函数不会绑定this、arguments属性箭头函数不能作为构造函数来使用不能和new一起来使用会抛出错误
箭头函数如何编写呢
(): 函数的参数{}: 函数的执行体 十一、箭头函数的编写优化 十二、this规则之外 – ES6箭头函数 箭头函数不使用this的四种标准规则也就是不绑定this而是根据外层作用域来决定this。 我们来看一个模拟网络请求的案例 这里我使用setTimeout来模拟网络请求请求到数据后如何可以存放到data中呢 我们需要拿到obj对象设置data 但是直接拿到的this是window 我们需要在外层定义var _this this 在setTimeout的回调函数中使用_this就代表了obj对象 之前的代码在ES6之前是我们最常用的方式从ES6开始我们会使用箭头函数 为什么在setTimeout的回调函数中可以直接使用this呢 因为箭头函数并不绑定this对象那么this引用就会从上层作用于中找到对应的this
十三、面试题