- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
目录
- 箭头函数
命名函数表达式
函数只能在函数体内有效
执行环境
- 隐式类型转换
函数参数加了默认值后
,此参数在函数体中不会被改变
(因为块级作用域)
一 箭头函数
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