函数的3种角色

函数的3种角色

函数数据类型 & 对象数据类型

函数数据类型:

普通函数

类 自定义类和内置类:

……

要知道哪些是函数哪些是对象,这样我才知道谁有prototype谁有__proto__

对象数据类型的特点:

每个对象数据类型的值都是由0-多组键值对组成,键值对即属性名和属性值,

函数的3种角色

普通函数:

形参/实参,arguments,return,箭头函数

当做普通函数执行的时候,全程跟prototype没有关系,因为prototype里的东西都是给当前类的实例调取用的。跟普通函数自上而下执行没有关系,普通函数执行完内存释放。

同一个函数两种角色之间是没有关系的。

普通函数:执行干点事,重点是闭包,私有+全局,作用域链。

构造函数:类和实例,原型和原型链,走的是这一套。

普通对象:2个属性:name和length-形参个数。只跟键值对有关系。

__proto__:指向所属类的原型。每个对象都天生自带__proto__,每个函数都天生自带prototype

*整个原型链 & 整套OOP

更上层的东西:

函数也是对象,它也有一个__proto__,__proto__这个属性指向的永远都是所属类的原型。你自己自定义的函数,都是Function这个内置类的实例。

  1. 每一个函数都是Functon这个内置类的实例;

而Function本身又是一个函数,而上一句话每个函数都是Function这个类的实例,所以Functon.__proto__指向的是它自己的prototype。所以由此可见,Function是一个很特殊的内置类。这里有点绕:所有的函数都是我的实例,然后我本身也是一个函数,所以我就是我自己的实例。

  1. 所有对象都是Object这个类的实例;

  2. 函数也是对象,所以函数也是Object这个类的实例,所以万物皆对象。

object:作为对象的方法。Object.create,Object.assign......

所以最后的值都指向了Object.prototype,这就是万物皆对象。

阿里面试题

a2f047a78994b79e48fd87307e2e432b.png4227a33fd7ce56e93eece1c14c14ba8b.png

解题思路:

变量声明:var一定是只声明,function一定是声明+赋值(定义)

函数执行,首先看是不是私有变量,不是就往上级作用域查找

9c0195bae73adc1912cf1743ff4abbff.pngd5258fe53852e4a51bbe52d8b2c2a4be.png

运算符的优先级:

成员访问 . 一般是很高的。

new()和 . 是一样的优先级,所以谁在左边谁先运算

然后再是new不带()

带参new和点. 是同级的,所以谁在左边谁就先执行

  1. 先new Foo()

  2. 再f.getName()

574a8bacb666a0240bf505a7e2299af5.png

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源码初步分析

  1. typeof window !== 'undefined'

window只要存在就不可能是undefined,所以!=='undefined'就代表是浏览器环境;

node环境下让它为global;

  1. typeof module === 'object' && typeof module.exports === 'object'

判断是node环境

jQuery.fn = jQuery.prototype

它绕了一圈又指回来了。。

  1. 首先是在原型上添加了一个init方法

new jQuery.fn.init=function...

  1. 然后又把init的原型指向了jQuery.prototype

init.prototype=jQuery.fn=jQuery.prototype

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值