[JS刷题] 函数与执行环境相关~~

316 阅读2分钟

目录

  1. 箭头函数
  2. 命名函数表达式 函数只能在函数体内有效
  3. 执行环境
  4. 隐式类型转换
  5. 函数参数加了默认值后, 此参数在函数体中不会被改变(因为块级作用域)

一 箭头函数

const num = {
  a: 10,
  add() {
    return this.a + 2;
  },
  reduce: () => this.a -2;
};
console.log(num.add()); //  12
console.log(num.reduce()); // NAN

命名函数表达式 函数只能在函数体内有效

var foo = function bar(){ return 1; };
console.log(typeof bar()); // Uncaught ReferenceError: bar is not defined
typeof(bar) // "undefined"
typeof(foo())// "number"
typeof(foo)  // "function"
 
var foo = function bar(){ 
    // foo is visible here 
    // bar is visible here
    console.log(typeof bar()); // Work here
};
// foo is visible here
// bar is undefined here

执行环境

var fullname = 'a';
var obj = {
   fullname: 'b',
   prop: {
      fullname: 'c',
      getFullname: function() {
         return this.fullname;
      }
   }
};
 
console.log(obj.prop.getFullname()); // c
var test = obj.prop.getFullname;
console.log(test());  // a

  • 原因在于this指向的是函数的执行环境,this取决于其被谁调用了,而不是被谁定义了。

对第一个console.log()语句而言,getFullName()是作为obj.prop对象的一个方法被调用的,因此此时的执行环境应该是这个对象。另一方面,但getFullName()被分配给test变量时,此时的执行环境变成全局对象(window),原因是test是在全局作用域中定义的。因此,此时的this指向的是全局作用域的fullname变量,即a。

四 隐式类型转换

隐式类型转换时: if中转换为布尔值. == 时转换为Number

当 a 出现在 if 的条件中时,被转成布尔值,而 Boolean([0])为 true,所以就进行下一步判断 a == true,在进行比较时,[0]被转换成了 0,所以 0==true 为 false

var a = [0];
if (a) {
  console.log(a == true); // false
} else {
  console.log(a); //不会执行
}

函数参数加了默认值后, 此参数在函数体中不会被改变(因为块级作用域)

因为 a 函数加了默认值,就按 ES6 的方式解析,ES6 是有块级作用域的,所以 c 的值是不会改变的

是arguments 中 c 的值,function a(a, b, c = 3) 这里的c,因为 a 函数加了默认值,所以就按 ES6 的方式解析,函数中的参数就不会变了

function side(arr) {
  arr[0] = arr[2];
}
function a(a, b, c = 3) {
  c = 10;
  console.log(arguments);
  side(arguments);  // 这里 a,c的值不管怎么改变都是不会改变的
  return a + b + c;
}
a(1, 1, 1);  //12

但是,如果是

function side(arr) {
  arr[0] = arr[2];
}
function a(a, b, c) {
  c = 10;
  console.log(arguments);
  side(arguments);  // 这里 a,c的值不管怎么改变都是不会改变的
  return a + b + c;
}
a(1, 1, 1);  // 21

参考