美文网首页饥人谷技术博客
任务17-函数表达式和作用域

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

作者: 嘿菠萝 | 来源:发表于2016-07-16 21:13 被阅读25次

    2016/7/18


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

    • 函数声明:


    • 函数表达式:


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

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

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

    变量的声明前置:



    函数的声明前置:

    3.arguments 是什么 (**)

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

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

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

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


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

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

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

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


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

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

    代码题

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

    相关文章

      网友评论

        本文标题:任务17-函数表达式和作用域

        本文链接:https://www.haomeiwen.com/subject/dyjujttx.html