difficult-question
题目
let a = 1;
(function a(){
a = 2;
console.log(a);
})()
console.log(a);
函数内的 console
ƒ a(){
a = 2;
console.log(a);
}
外部的 console
1
题目二
var b = function c () {
console.log(c) //可见
}
b()
console.log(c) //Uncaguht ReferenceError: c is not defined
foo = function xxx (){
console.log(123)
}
foo()
// xxx() //not defined
function ccc (){
console.log(456)
}
bar = ccc
bar()
ccc()
// 调用之后赋值
ddd = ccc()
console.log(ddd); //undefined
题目三
function functions(flag) {
if (flag) {
function getValue() { return 'a'; }
} else {
function getValue() { return 'b'; }
}
return getValue();
}
function functions(flag) {
function getValue() {return(flag)?'a':'b'; }
return getValue();
}
// 原函数的问题是因为不存在块级作业域getValue函数被重写
面试题
let x, {x:y=1} = {x} ;
// y 1,x 为 undefined,使用了 默认值 1
// x ?
题目
let endRecord = startRecord = null
省略了声明,startRecord 自动上升了成了全局变量,导致出错
This
This
可见 new
对 this
的影响比 bind
优先级要高,
g
虽然通过 bind
绑定了 this
指向的对象为 {a:1}
,
但是使用 new g
调用的时候,this
仍然指向以 f
为构造函数的实例。
let a = {
b:{
c(){
console.log(this)
}
}
}
console.log(a.b.c()); // {c: }
parameter 是指函数定义中参数,而 argument 指的是函数调用时的实际参数。简略描述为:parameter=形参 (formal parameter), argument=实参 (actual parameter)。
解析
a=2 执行的不是给全局变量 a 赋值为 2,而是想要将自执行函数的 name 'a', 更改为 2,但这句话在 console.log 后证实未执行,即这句代码被忽略了。
没错。在第一行加一句代码 "use strict"; 在严格模式下执行就能看到报错 :Uncaught TypeError: Assignment to constant variable (常数变量赋值),
而这个错误在正常模式下是不会执行的,也就是静默错误,直接忽略执行。
所以打印的结果是 f a()
为什么严格模式下报错,因为 Function.name 的 Writable 属性默认是不可写的。(但可通过 Object.defineProperty() 更改)
let descriptor = Object.getOwnPropertyDescriptor(a,"name")
console.log(descriptor.value) // a
console.log(descriptor.writable) // false