You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
问题在于 声明和变量语句的算法,这里属于 绑定标识符 初始化器,那么找到 let, const 以及 var 相对应的算法,
var 对应的算法内部最终走 PutValue,然后会走给全局变量设置属性这一步,也就是说,最终给全局对象设置了 bar 属性,其值为创建的函数 baz!但是,并没有把 baz 函数单独绑定到全局对象上!!!
let,const 对应的算法内部走的是 InitializeReferencedBinding,其本质也是将 bar 与 函数绑定,但是并没有单独创建一个叫 baz 的变量,即函数baz 以变量 bar 的身份“活着”!
这与直接 function baz(){} 声明函数是不同的
2020-03-16 补充
函数参数问题:
// 来自 高级前端面试functioncompareMembers(person1,person2=person1){if(person1!==person2){console.log('Not the same!')}else{console.log('They are the same!')}}constperson={name: 'Lydia'}compareMembers(person)// They are the same!
函数:函数定义
思考以下代码
使用 function 关键字创建的普通函数求值
函数声明 : function 绑定标识符 ( 形参 ) { 函数体 }
函数声明 : function ( 形参 ) { 函数体 }
函数表达式 : function ( 形参 ) { 函数体 }
函数表达式 : function 绑定标识符 ( 形参 ) { 函数体 }
函数语句列表 : [empty]
回顾文头代码
以上代码属于 函数表达式 : function 绑定标识符 ( 形参 ) { 函数体 } 和 声明和变量语句 共同作用的结果。
name
为'baz'
,没有问题!let
,const
以及var
相对应的算法,var
对应的算法内部最终走 PutValue,然后会走给全局变量设置属性这一步,也就是说,最终给全局对象设置了bar
属性,其值为创建的函数baz
!但是,并没有把baz
函数单独绑定到全局对象上!!!let
,const
对应的算法内部走的是 InitializeReferencedBinding,其本质也是将bar
与 函数绑定,但是并没有单独创建一个叫baz
的变量,即函数baz
以变量bar
的身份“活着”!function baz(){}
声明函数是不同的2020-03-16 补充
函数参数问题:
见 MDN —— 默认参数可用于后面的默认参数
2020-07-17 补充
最近又继续看winter《重学前端》中未看的部分章节,发现个关于 函数名 的有趣问题:
以上三种写法有什么区别嘛?
老实说,我第一次接触时只会第一种即
fn1: function fn(){}
这种写法,后来也是看了别人的代码才发现有第二种直接fn2(){}
的写法。其实刚接触时还是很惊奇的,心想为什么能这样写,但是,由于我菜加上都不知道该怎么问这个问题,所以就选择性忽略了。好在这个问题倒不是非常重要。现在看了《重学前端》后,关于这个问题的疑问又涌上心头了!
1. 为什么可以在对象中像上述
fn2(){}
这样写?见 重学js —— 函数:箭头函数定义和方法定义 中的 方法定义。简而言之,规范允许。
2. 上述代码中为何直接打印
fn
不报错还返回函数?其实很简单,当局者迷罢了。
这种写法本质是:
这样拆开来就很好理解了吧。
2020-07-29 补充
来自高级前端面试小程序 js基础 第23题,我做错了
我看了一眼想都不用想说了 google。。。
其实这里坑点在于形参
o
,它其实可以看做函数的一个变量,这么理解的话就容易多了,一开始这个变量和webSite
指向一致,后来在内部又对它重新指向另一个对象了,自然不会影响webSite
。The text was updated successfully, but these errors were encountered: