javascript經典面試題16道
第1題.
console.log(a)?
var a = 12
function fn() {
? console.log(a)
? var a = 13
}
fn()
console.log(a)?
第2題.
console.log(a)
var a = 12
function fn() {
console.log(a)
a = 13
}
fn()
console.log(a)
第3題.
console.log(a)?
let a = 12?
function fn() {
? console.log(a)?
? let a = 13?
fn()
console.log(a)
解析:
console.log(a)? //報錯
let a = 12? //let定義的變量补鼻,不存在提升
function fn() {
? console.log(a)? //報錯哄啄,注意:只要是當前作用域里面的存在的變量,就不會去上層作用域找了
? let a = 13? //let定義的變量风范,不存在提升
}
fn()
console.log(a)
第4題.
console.log(a)?
a = 12?
function fn() {
console.log(a)
let a = 13
}
fn()
console.log(a)
解析:
console.log(a)? //報錯
a = 12? // 定義變量可以不使用任何關鍵字咨跌,但是在定義該變量之前,不能使用該變量(這是一種不規(guī)范寫法)
function fn() {
console.log(a)? //報錯
let a = 13
}
fn()
console.log(a)
第5題.
var foo = 1
function bar() {
? if (!foo) {
? var foo = 10?
? }
console.log(foo)
}
bar()
解析:
var foo = 1
function bar() {
? if (!foo) {
? var foo = 10? //這個foo會提升到當前作用域的頂部定義
? }
console.log(foo)? //10
}
bar()
第6題.
var foo = 1
function bar() {
? if (!foo) {
? ? foo = 10
? }
console.log(foo)?
}
bar()
解析:
第7題.
var n = 0
function a() {
? var n = 10?
? function b() {
? ? ? n++?
? console.log(n)?
? }
? b()
? return b
}
var c = a()
c()
console.log(n)?
解析:
var n = 0
function a() {
? var n = 10? //11? 12
? function b() {
? ? ? ? n++? //11? 12
? ? console.log(n)? //11? 12
? }
? b()
? return b
}
var c = a()
c()
console.log(n)? // 0
第8題.
var a = 10
var b = 11
var c = 12
function test(a) {
? ? a = 1
? ? var b = 2?
? ? c = 3?
}
test(10)
console.log(a)?
console.log(b)?
console.log(c)?
解析:
var a = 10
var b = 11
var c = 12
function test(a) {
? ? a = 1
? ? var b = 2? //方法里面的作用域b是2
? ? c = 3? //會將外層作用域的c的值換掉
}
test(10)
console.log(a)? // 10
console.log(b)? // 11
console.log(c)? // 3
第9題.
if (!('a' in window)) {
? ? ? var a = 10
}
console.log(a)
解析:
// in關鍵字硼婿,用于檢查一個屬性是否包含在指定的對象中锌半,如果包含就返回true
if (!('a' in window)) {
? ? ? var a = 10
}
console.log(a) //undefined
第10題.
var a = 4
function b(x, y, a) {
? console.log(a)
? arguments[2] = 10?
? console.log(a)?
}
a = b(1, 2, 3)?
console.log(a)?
解析:
var a = 4
function b(x, y, a) {
? console.log(a)? // 打印形參的值 3
? arguments[2] = 10? // 又將形參a改成而來 10
? console.log(a)? // 10
}
a = b(1, 2, 3)? //b方法,沒有返回任何內容寇漫,默認返回undefined
console.log(a)? //undefined
第11題.
var a = 9
function fn() {
? a = 0?
? return function (b) {
? ? ? return b + a++
? }
}
var f = fn()
console.log(f(5))?
console.log(fn()(5))
console.log(f(5))?
console.log(a)
解析:
var a = 9
function fn() {
? ? a = 0? // 1 2
? ? return function (b) {
? ? ? ? return b + a++? 第一次// 5 + 0? ? 第二次//? 5 + 1
? ? }
}
var f = fn()
console.log(f(5))? //5
console.log(fn()(5))? //5
console.log(f(5))? //6
console.log(a) //2
第12題.
var ary = [1, 2, 3, 4]
function fn(ary) {
? ? ary[0] = 0?
? ? ary = [0]? ?
? ? ary[0] = 100
? ? return ary
}
var res = fn(ary)?
console.log(ary)? ?
console.log(res)?
解析:
var ary = [1, 2, 3, 4]
function fn(ary) {
? ? ary[0] = 0? // 修改了原數組中第一位的值
? ? ary = [0]? ? // arr形參重新賦值一個新的數組
? ? ary[0] = 100 // 形參arr再修改第一個位置的值刊殉,就跟原數組沒關系
? ? return ary
}
var res = fn(ary)? // [100]
console.log(ary)? ? // [0,2,3,4]
console.log(res)? // [100]
第13題.
function fn(i) {
? return function (n) {
? console.log(n + i++)?
? }
}
var f = fn(10)
f(20)?
fn(20)(40)?
fn(30)(50)?
f(30)
解析:
function fn(i) {? //10->11
? ? return function (n) {? //30
? ? console.log(n + i++)? //41
? ? }
}
var f = fn(10)
f(20)? //30
fn(20)(40)? //60
fn(30)(50)? //80
f(30) //41
第14題.
var num = 10?
var obj = { num: 20 }
obj.fn = (function (num) {
? ? this.num = num * 3
? ? num++
? ? return function (n) {
? ? ? ? this.num += n?
? ? ? ? num++?
? ? ? ? console.log(num)?
? ? }
})(obj.num)
var fn = obj.fn
console.log(fn)?
fn(5)?
obj.fn(10)
console.log(num, obj.num)
解析:
var num = 10? //60=>65
var obj = { num: 20 }? //=>30
obj.fn = (function (num) {? //20=>21
? ? this.num = num * 3? //this->window
? ? num++ // 21
? ? return function (n) { //10
? ? ? ? this.num += n? // 30
? ? ? ? num++? //22=>23
? ? ? ? console.log(num)? //22=>23
? ? }
})(obj.num)
var fn = obj.fn
console.log(fn)? //function(n){this.num +=n;num++;console.log(num)}
fn(5)? // 22 //此時this->window fn(5) = window.fn(5)
obj.fn(10) //23 此時this=>obj,所以this.name = 20
console.log(num, obj.num) //65 30
第15題.
var fullName = 'language'
var obj = {
? fullName: 'javascript',
? prop: {
? ? ? ? getFullName: function () {
? ? ? ? ? ? return this.fullName
? ? ? ? }
? }
}
console.log(obj.prop.getFullName())
var test = obj.prop.getFullName
console.log(test())?
解析:
var fullName = 'language'
var obj = {
? ? fullName: 'javascript',
? ? prop: {
? ? ? ? getFullName: function () {
? ? ? ? ? ? return this.fullName
? ? ? ? }
? ? }
}
console.log(obj.prop.getFullName())? // undefined
var test = obj.prop.getFullName // 將getFullName方法傳給test
console.log(test())? // language
第16題.
var name = 'window'
var Tom = {
? name: "tom",
? show: function () {
? ? console.log(this.name)
? },
? wait: function () {
? ? ? var fun = this.show
? ? ? fun()
? }
}
Tom.wait()?
解析:
var name = 'window' // var定義的變量會成為window的屬性
var Tom = {
? name: "tom",
? show: function () {
? ? ? console.log(this.name)? // window
? },
? wait: function () {
? ? ? var fun = this.show
? ? ? fun()
? }
}
Tom.wait()? // window