JS 函数的 this
为什么有 this
● 在常见的编程语言中,几乎都有 this 这个关键字(Objective-C 中使用的是 self),但是 JavaScript 中的 this 和常见的面向对象语言中的 this 不太一样:
● 常见面向对象的编程语言中,比如 Java、C++、Swift、Dart 等等一系列语言中,this 通常只会出现在类的方法中
● 也就是你需要有一个类,类中的方法(特别是实例方法)中,this 代表的是当前调用对象。
● 但是 JavaScript 中的 this 更加灵活,无论是它出现的位置还是它代表的含义。
js 的 this 的作用:
● this 在全局的作用域指向什么?
● 浏览器:绑定 window,
● node : 绑定{} 空对象
● node 会把当前的文件当成一个模块,module -> 加载 -> 编译-> 会把的有的参数放入到一个函数, -> 执行函数.apply ({})
● 函数的 this 在调用的时候才进行动态绑定(this 是在运行时被绑定的)
● 同一个函数,但是每一个 this 指向的不同的值,(谁调用指谁)4 个规则
● 绑定一:默认绑定;
● 独立的函数调用我们可以理解成函数没有被绑定到某个对象上进行调用;
● foo() // 调用前面没有任何对象,代表 window || node{}
● 绑定二:隐式绑定;
● 它的调用位置中,是通过某个对象发起的函数调用
● 绑定三:显示绑定;
● 我们明确的绑定了 this 指向的对象,所以称之为显示绑定。
● JavaScript 所有的函数都可以使用 call 和 apply 方法(这个和 Prototype 有关)。
● 它们两个的区别这里不再展开;
● 其实非常简单,第一个参数是相同的,后面的参数,apply 为数组,call 为参数列表;
● 这两个函数的第一个参数都要求是一个对象,这个对象的作用是什么呢?就是给 this 准备的。
● 在调用这个函数时,会将 this 绑定到这个传入的对象上。
● call、apply、bind
区别
● 绑定四:new 绑定;
● JavaScript 中的函数可以当做一个类的构造函数来使用,也就是使用 new 关键字。
● 1.创建一个全新的对象;p2.这个新对象会被执行 prototype 连接;p3.这个新对象会绑定到函数调用的 this 上(this 的绑定在这个步骤完成);p4.如果函数没有返回其他对象,表达式会返回这个新对象;
● 内置函数的绑定
● this 规则之外–忽略显示绑定
● 如果在显示绑定中,我们传入一个 null 或者 undefined,那么这个显示绑定会被忽略,使用默认规则:
● this 规则之外-间接函数引用
● 赋值(obj2.foo = obj1.foo)的结果是 foo 函数;foo 函数被直接调用,那么是默认绑定
● 优先级
● 1.默认规则的优先级最低
● 毫无疑问,默认规则的优先级是最低的,因为存在其他规则时,就会通过其他规则的方式来绑定 this
● 2.显示绑定优先级高于隐式绑定
● 3.new 绑定优先级高于隐式绑定
● 4.new 绑定优先级高于 bind
● new 绑定和 call、apply 是不允许同时使用的,所以不存在谁的优先级更高
● new 绑定可以和 bind 一起使用,new 绑定优先级更高
评论