call,apply,bind关键字
一.call
1.一般来说,当函数或者构造函数中,含有this关键字这类程序
如果不调用就不会运行,也就是说,当去调用函数的时候,this才会指向调用者的名字,所以不运行就不知道this指向的到底是谁。
2.当使用call关键字时,如下
` // var obj1={name:"jack",age:18,say:function (arg1,arg2) {
// console.log(arg1,arg2)
// console.log(this.name,this.age)
// }}
// var obj2={name:"xxxxx",age:"xxxx"}
// obj1.say()
// obj2.xxx=obj1.say
// obj2.xxx()
// obj1.say.call(obj2,100,200)
`
最后一行代码就是call的用法
先看个简单的obj1.say.call(obj2)
这里就是说将obj2指定为函数obj1.say
的调用者,所以当你去使用obj1.say.call(obj2)
时里面的this指向的就是obj2,打印的name,age都是obj2的name,age
关于 obj1.say.call(obj2,100,200)
,这里就是先将函数的调用者标明为obj2,然后再传入100,200这两个参数
二.apply
1.apply和call类似,唯一不同的就是在传入参数的时候,传入的数据要用数组来传递例如 obj1.say.call(obj2,[100,200])
三.bind
1.bind也是设计用来指向函数的调用者的,与apply,call的区别就是bind是在设计函数时就已经把函数的调用者写好了,call和apply是在使用时再去传入指定的函数调用者。
2.不过声明的函数一般来说不能直接绑定,只能方法直接绑定,如
var obj2={name:'karen',say:function() {
console.log(this)
}.bind(obj1)}
补充 ↓
AO与GO对象&scope (未解决)
来源:CSDN网友的见解
来源:CSDN网友的见解
附上人家的理解,自己写着头疼,消化了再写
关于scope和AOGO对象实际上两者是相关的,简单的来说
AO&GO是脚本运行之前,函数的预编译和全局的预编译。
当函数声明时,就会诞生[[scope]]这个属性,他是函数本身自带的但是无法调用,它的作用是形成一个作用域,如果是嵌套函数的话,内部的函数在外部函数调用时,它的scope才生成,所以也有种理解就是为什么外部函数不能访问内部函数的数据,就是以上的情况
但是也有一种方法可以访问内部数据,就是return,return能把内部scope返回出来,当然,还是要内部函数的scope生成之后才可以
四,垃圾回收机制与内存泄漏
来源:CSDN网友的见解
偷懒again hhh
2019年11月22日补充
涉及到垃圾回收以及预防内存泄漏Es6专门提供了两种数据结构专门用于这种情况
- WeakSet
- WeakMap
到此结束
if的一些小问题
这里就是说,if内部不能声明函数,如果你声明了,虽然不会报错,但是函数也不会运行,算是无效代码
function fn() {
if (false) {
function b() {
console.log(666)
}
}
console.log(b)//api==>if里面不能声明函数 浏览器==>不会报错
b()
}
fn()
这里是一个例子,当当当if的判断为false时(打字也能口吃???),b的打印结果是这个函数未定义,照常理来说,么有函数不谈作用域,所以函数b应该和打印语句是同一个作用域下的,就算判断条件失败,至少也会有b函数的声明,应该是undefined而非b不是一个函数(这里是按照假逻辑来推的实际上这种说法就是错的),所以通过这里就知道不应该在if语句内部写函数