函数的3种角色"/>
函数的3种角色
函数的3种角色
函数数据类型 & 对象数据类型
函数数据类型:
普通函数
类 自定义类和内置类:
……
要知道哪些是函数哪些是对象,这样我才知道谁有prototype谁有__proto__
对象数据类型的特点:
每个对象数据类型的值都是由0-多组键值对组成,键值对即属性名和属性值,
函数的3种角色
普通函数:
形参/实参,arguments,return,箭头函数
当做普通函数执行的时候,全程跟prototype没有关系,因为prototype里的东西都是给当前类的实例调取用的。跟普通函数自上而下执行没有关系,普通函数执行完内存释放。
同一个函数两种角色之间是没有关系的。
普通函数:执行干点事,重点是闭包,私有+全局,作用域链。
构造函数:类和实例,原型和原型链,走的是这一套。
普通对象:2个属性:name和length-形参个数。只跟键值对有关系。
__proto__:指向所属类的原型。每个对象都天生自带__proto__,每个函数都天生自带prototype
*整个原型链 & 整套OOP
更上层的东西:
函数也是对象,它也有一个__proto__,__proto__这个属性指向的永远都是所属类的原型。你自己自定义的函数,都是Function这个内置类的实例。
-
每一个函数都是Functon这个内置类的实例;
而Function本身又是一个函数,而上一句话每个函数都是Function这个类的实例,所以Functon.__proto__指向的是它自己的prototype。所以由此可见,Function是一个很特殊的内置类。这里有点绕:所有的函数都是我的实例,然后我本身也是一个函数,所以我就是我自己的实例。
-
所有对象都是Object这个类的实例;
-
函数也是对象,所以函数也是Object这个类的实例,所以万物皆对象。
object:作为对象的方法。Object.create,Object.assign......
所以最后的值都指向了Object.prototype,这就是万物皆对象。
阿里面试题
解题思路:
变量声明:var一定是只声明,function一定是声明+赋值(定义)
函数执行,首先看是不是私有变量,不是就往上级作用域查找
运算符的优先级:
成员访问 . 一般是很高的。
new()和 . 是一样的优先级,所以谁在左边谁先运算
然后再是new不带()
带参new和点. 是同级的,所以谁在左边谁就先执行
-
先new Foo()
-
再f.getName()
function Foo(){getName=function(){console.log(1);}return this;
}
Foo.getName=function(){console.log(2);
}
Foo.prototype.getName=function(){console.log(3);
}
var getName=function(){console.log(4);
}
function getName(){console.log(5);
}
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
闭包的开胃题
// 一道闭包的开胃题
function fun(n,o){console.log(o)return {fun:function(m){return fun(m,n)}}
}
var c=fun(0).fun(1);
c.fun(2);
c.fun(3);
// undefined
// 0
// 1
// 1
jquery源码初步分析
-
typeof window !== 'undefined'
window只要存在就不可能是undefined,所以!=='undefined'就代表是浏览器环境;
node环境下让它为global;
-
typeof module === 'object' && typeof module.exports === 'object'
判断是node环境
jQuery.fn = jQuery.prototype
它绕了一圈又指回来了。。
-
首先是在原型上添加了一个init方法
new jQuery.fn.init=function...
-
然后又把init的原型指向了jQuery.prototype
init.prototype=jQuery.fn=jQuery.prototype
更多推荐
函数的3种角色
发布评论