函数与作用域

2017-12-26  本文已影响0人  羌生

一、函数声明和函数表达式有什么区别

函数声明:函数声明必须有函数名,函数可以在任意地方调用。
函数表达式:前后两个函数的名字可以相同也可以不相同, function 后面的这个名字是可以省略的 , function 后面的这个名字只能再函数内部使用 ,函数调用只有在函数表达式声明后调用。

二、什么是变量的声明前置?什么是函数的声明前置

当执行流进入一个作用域后,作用域里面的函数和变量会被提升到作用域顶部预先解析,此时变量被赋值为undefined,变量真正的值不会提升,函数则是整体被提升,确保所有代码执行之前已经全部被解析,无论在哪里调用此函数都会执行。如下所示

            a();    // a
            console.log(b);    // undefined
            function a(){
                console.log("a");
            }
            var b="b";
            console.log(b);    // b

三、arguments 是什么?

arguments 是一个对应于传递给函数的参数的类数组对象。arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。如下代码:

            function a(){
                console.log("名字:"+arguments[0]);    //名字:小明
                console.log("年龄:"+arguments[1]);    //年龄:22
                console.log("性别:"+arguments[2]);    //性别:男
                console.log("传进的参数有几个:"+arguments.length+"个");    //3个
            }
            function b(name,age,sex,achievement){
                console.log("name:"+name);    //name:小红
                console.log("age:"+age);    //age:21
                console.log("sex:"+sex);      //sex:女
                console.log("achievement"+achievement) //achievement:A+
                console.log("传进的参数有几个:"+arguments.length+"个");    //4个
                arguments[0]="小青"
                console.log("名字被改为"+name+"了");    //名字被改为小青   
            }                                                    
            a("小明","22","男");
            b("小红","21","女","A+")

四、函数的"重载"怎样实现

js中没有重载! 同名函数会覆盖。 但可以在函数体针对不同的参数调用执行相应的逻辑。

 function printPeopleInfo(name, age, sex){
    if(name){
      console.log(name);
    }

    if(age){
      console.log(age);
    }

    if(sex){
      console.log(sex);
    }
  }

  printPeopleInfo('Byron', 26);
  printPeopleInfo('Byron', 26, 'male');

第一次调用时,没有sex参数,函数内的sex参数被赋值为undefined,if的判断里面的undefined,被转换为false,里面的代码不会被执行,所以实现了"重载"。

五、立即执行函数表达式是什么?有什么作用?

  1. 立即执行函数表达式是什么
    定义一个函数后,立即调用这个匿名函数;它还有多种写法:
(function(){alert('立即执行函数')} ()) // 用括号把整个表达式包起来
(function(){alert('立即执行函数')}) () //用括号把函数包起来
!function(){alert('立即执行函数')}() // 求反
+function(){alert('立即执行函数')}()
。。。等等
  1. 作用:
    ① 是不必为函数命名,避免了污染全局变量;
    ② IIFE内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。
上一篇 下一篇

猜你喜欢

热点阅读