任务17-函数表达式和作用域


2016/7/18


1.函数声明和函数表达式有什么区别 (*)

  • 函数声明:


  • 函数表达式:


  • 在声明一个变量的时候,javascript解释器会将变量声明的语句提升,在声明函数的时候会发生函数前置,所以代码放在函数之前的代码放在函数使用之后也可以生效

  • 在函数表达式里面,只发生了变量声明提前,如果在定义前使用,函数只是一个变量名,用()进行调用会报错

2.什么是变量的声明前置?什么是函数的声明前置 (**)

变量的声明前置:



函数的声明前置:

3.arguments 是什么 (**)

在函数内部,你可以使用arguments对象获取到该函数的所有传入参数,类似数组,可以实现类似函数重载的效果

4.函数的重载怎样实现 (**)

重载是很多面向对象语言实现多态的手段之一,在静态语言中确定一个函数的手段是靠方法签名——函数名+参数列表,也就是说相同名字的函数参数个数不同或者顺序不同都被认为是不同的函数,称为函数重载

在JavaScript中没有函数重载的概念,函数通过名字确定唯一性,参数不同也被认为是相同的函数,后面的覆盖前面的,在js中利用arguments实现函数重载的效果,实现一个函数,参数不同功能不同的效果


5.立即执行函数表达式是什么?有什么作用 (***)

立即执行函数,不需要进行函数的调用立即执行,可以将写在函数体内的语句立即执行。区别于普通语句,立即执行函数内的变量不会干扰函数体外,形成一个类似区块的空间。

6.什么是函数的作用域链 (****)

在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。


在函数执行过程中,每遇到一个变量,都会经历一次标识符解析过程以决定从哪里获取和存储数据。该过程从作用域链头部,也就是从活动对象开始搜索,查找同名的标识符,如果找到了就使用这个标识符对应的变量,如果没找到继续搜索作用域链中的下一个对象,如果搜索完所有对象都未找到,则认为该标识符未定义。函数执行过程中,每个标识符都要经历这样的搜索过程。

简单来说,函数作用域链用于查找函数内部变量的位置。在执行过程中,按照作用域链表的顺序依次进行查找。在函数每执行一次,这个表进行动态创建。所以,在实际使用中应当尽量减少全局变量的使用,避免with语句使用,如果一个跨作用域的对象被引用了一次以上,则先把它存储到局部变量里再使用。

代码题

文/吴秀芳,简书作者
著作权归作者和饥人谷所有,转载请联系作者获得授权,并标注“简书作者”。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.函数声明和函数表达式有什么区别 (*) 函数声明 函数表达式 函数声明:函数调用可以发生在函数声明之前,例如下...
    TimeLesser阅读 422评论 4 4
  • 一、函数声明和函数表达式有什么区别?(*) ** 1.ECMAScript里面规定了三种声明函数的方式**①构造函...
    鸿鹄飞天阅读 488评论 0 0
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 2,331评论 0 21
  • 可能很多认识我的人都不知道,因为我不常提起,我是一个单亲家庭的孩子。是的,我从五岁开始就被获得了这个“荣誉称...
    墨尘谷雨阅读 419评论 0 3
  • 一个团队的开发效率并不是与团队人数正相关。相反的,团队规模的扩大反而会降低人均开发效率。按照亚马逊的“两个披萨”原...
    刘刻阅读 490评论 0 1