Skip to content

这段代码打印什么

具名自执行函数的变量为只读属性,不可修改

javascript
var b = 10
;(function b() {
  b = 20
  //1.内部作用域,会先找到function b 的b
  //2.找到后赋值,但由于具名自执行函数的变量为只读属性,不可修改,类似与这个b时const,所以b=20无效
  //3.最后b还是个function
  console.log(b) //f b(){...}
})()

//对照参考1
function a() {
  a = 20
  console.log(a)
}
a() //20

//对照参考2
var a = 10
function a() {
  a = 20
  console.log(a)
}
a() //Uncaught TypeError: a is not a function
//函数声明优先于变量声明,a已不再是方法

getName()输出什么?

javascript
function Foo() {
  getName = function() {
    console.log(1)
  }
  return this
}
Foo.getName = function() {
  console.log(2)
}
Foo.prototype.getName = function() {
  console.log(3)
}
var getName = function() {
  console.log(4)
}
function getName() {
  //提升后被console.log(4);覆盖
  console.log(5)
}

Foo.getName() //2
getName() //4
Foo().getName() //1 Foo()返回得this就是window
getName() //1 上一句中覆盖了外面得getName
new Foo.getName() //2 打印2 还会返回getName的实例
new Foo().getName() //3 调用原型上的getName方法
new new Foo().getName() //3 打印3 还会返回原型上getName的实例