2019-12-06 JavaScript 函数与作用域

JS的函数总结

Q1 创建函数有哪些方法?分别有什么特点?

创建函数3种方式:

(1)声明式

解析器会先读取函数声明,并使其在执行任何代码之前可以访问;

function Fn(x,y){
    return x + y;
}
(2)匿名式

必须等到解析器执行到它所在的代码行才会真正被解释执行

var fn=function(x,y){
    return x + y ;
}
(3)Function式

从技术角度讲,这是一个函数表达式。一般不推荐用这种方法定义函数,因为这种语法会导致解析两次代码(第一次是解析常规ECMAScript代码,第二次是解析传入构造函数中的字符串),从而影响性能。

//new Function(arg1,arg2...,body)
var sum = new Function('x','y','return x + y ;')
sum(1,2)  //3
//特殊注意点:
var name='sss';
  function fun(){
    var name='lll';
    return new Function('return name');//不能获取局部变量
  }
 console.log(fun()()); //sss
 //另一个注意点
 new Function('var x =1;return x;')() //1
 x  //报错,外部无法访问Function内部变量

Q2 见如下代码,b会打印出什么?

(function() {
   var a = b = 5;
})();
 
console.log(b);

结果是5,解析:
var a = b = 5;等价于:
b = 5;
var a = b;
对于没有写var的变量系统默认为是全局变量,哪里都可以访问到,a则是局部变量只能在函数内部可以访问,所以这里打印b的值是5,a is not defined.

Q3 编写一个函数,实现一个输出 n (n > 0,否则返回原字符串)遍连接后的 str 功能,如下:

var a = repeatStr('hello', 2);  //hellohello
var a = repeatStr('hello', 4);  //hellohellohellohello

函数实现如下:

function repeatStr(str, n) {
      var result = "";
      if (n <= 0) {
        return str;
      }
      for (let i = 0; i < n; i++) {
        result += str;
      }
      return result;
    }

Q4 以下代码的执行结果是:

function test() {
   console.log(a);
   console.log(foo());
   
   var a = 1;
   function foo() {
      return 2;
   }
}
 
test();

结果是undefined 2,分析如下:
1、变量在声明之前不能访问,所以打印a为underfined
2、函数是声明式创建,前面提到,声明式创建解析器会先读取函数声明,并使其在执行任何代码之前可以访问;所以函数可以访问,打印为2

Q5 以下代码的执行结果分别是:

function foo(){
    return 1;
}
var foo;
console.log(typeof foo);

结果是:function

function foo(){
    return 1;
}
var foo = 1;
console.log(typeof foo);

结果是:number,
分析如下:
两个程序的区别在于var foo是否赋值,在Js中,声明一个变量是不给该变量开辟空间的,所以如果不赋值,foo还是之前的foo()函数,赋值之后,foo变成了一个number变量。

Q6 编写一个函数,实现一个乘法计算器:无论输入多少个数字参数,最终都返回参数的乘积。例如:

var a = multiplicationCalculator(3, 6); // 18
var b = multiplicationCalculator(3, 6, 2); // 36
var c = multiplicationCalculator(1, 2, 5, 6); // 60
.........

函数程序如下:

function multiplicationCalculator() {
  var result = 1;
  for (let i = 0; i < arguments.length; i++) {
    result *= arguments[i];
  }
  return result;
}

Q7 编写一个函数,实现如下语法的功能:var a = add(2)(3)(4); // 9,提示:2 + 3 + 4 = 9

解题关键:add()函数需要返回一个加法函数,而不是一个普通的值,即定义add(),并想办法让add()返回一个add()。js最显著的特征就是函数的返回值可以是一个函数。
程序代码如下:

function add(a) {
  var fn = function(b) {
      return add( a+b ); //fn返回的是add函数,并将a与b相加的值传递给add
  }
  fn.toString = fn.valueOf = function() {
      return a; // 1为什么返回a?   // 2为什么定义fn.toString而不是add.toString?
  }
  return fn;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容