题目1:
if (!('a' in window)) {
var a = 10
}
console.log(a)
//上方的意思是如果在window中a为undefined或为null则为true
//由于下方的var a=10是一个变量,具有变量的提升性此时的var a=undefined
//所以就不会执行下方的代码,此时直接跳过,打印得到undefined
// 解析:有var,不管所在的if中,条件是否成立,都会变量提升,都会有个var a = undefined 。也就是window.a = undefined.
// 所以 'a' in window成立。所以if进不来,a没有被再次赋值,一直是undefined。
var a = 9
function fn() {
a = 0
return function (b) {
return b + a++
}
}
var f = fn()
//此时将函数fn()的调用赋给了变量f
console.log(f(5))
//打印调用函数f()也就是fn()的调用此时B的值为5函数return返回输出的也就是b的值为5加上a的值
// 因为a是先将值打印再给a进行重新赋值,所以返回的值为5,打印也就是5
console.log(fn()(5))
//调用函数fn 此时return的函数形参b的值也就是5,所以返回输出的值也就是5+0,因为这个调用的函数和上方的调用互不干扰,
//打印的值也就是5
console.log(f(5))
//调用函数f() 此时b的值也就是5,由于上方已经完成函数的调用,此时a的值也就是1
//打印的值也就是6
console.log(a)
// 由于上方完成了函数操作,此时a的值进行了重新的赋值上方的完成a++,此时得到的值也就是2
var ary = [1, 2, 3, 4]
function fn(ary) {
ary[0] = 0
ary = [0]
ary[0] = 100
return ary
}
var res = fn(ary)
//执行上方的代码因为下方与上方数组形成了冲突也就是结束了函数,reture ary的值,得到了一个新的数组
//所以这里输出的值也就是一个新的数组[0,2,3,4]
console.log(ary)
console.log(res)
// //调用函数fn(),把这里的实参放入函数中,也就得到了ary=[0,2,3,4]
//在接着执行的时候将数组的变成了一个数,在完成ary[0]=100,也就是给ary重新进行赋值100,所以输出的结果就是[100]
// ary[0] = 0 改变的是ary的第一个元素,ary是引用类型。ary = [0] 之后,
// ary已经和全局的ary切断了联系,因为重新开辟的内存空间,不再是同一个引用
function fn(i) {
return function (n) {
console.log(n + (i++))
}
}
var f = fn(10)
//将调用函数的fn实参为10赋给了变量F,值为10
f(20)
//调用函数fn实参为10的数,此时n的值为20在加上i为10的值,也就是30
fn(20)(40)
//调用函数fn,此时实参为20,也就是函数fn的形参为i为20,再次调用也就是reture出去的函数
//也就是这里的实参对应的就是上方函数实参的n,得到的值也就是60
fn(30)(50)
//调用函数fn,此时实参为30,也就是函数fn的形参为i为30,再次调用也就是reture出去的函数
//也就是这里的实参对应的就是上方函数实参的n,得到的值也就是80
f(30)
//由于上方已经调用过i的值,所以此时i的值为11
//return出去的函数的形参也就对应这里的调用的实参30,得到的值也就是41
var num = 10
var obj = {
num: 20
}
obj.fn = (function (num) {
this.num = num * 3//60
num++ //21
return function (n) {
this.num += n //65
num++ //22
console.log(num)
}
})(obj.num)
var fn = obj.fn
fn(5)
//这里的函数是一种自适应函数,所以会立马执行,把这里的实参obj.num带到上方的形参Num
//所以此时num也就等于了20 所以这里的this.num的值也就为60,因为这里的this指向的是window,所以上方var num也就等于了60
//在执行下方的num++此时得到num的值为21,在完成下方返回输出的值num++以后得到的num的值也就是22
obj.fn(10)
//也就是此时的的10为一个实参对应的值为形参为n,所以此时的this指向的是obj得到的的num的值为
//就是此时的this.num等于20,在加上n的值,也就得到了obj.num的值为30,此时num的值也就是在上一次调用的基础上在加1,得到23
console.log(num, obj.num)
//此时num也就是上方赋予的一个原先num为60是,再加上上方传参进入的5,也就是65
//上方中obj.num的值为30
var fullName = 'language'
var obj = {
fullName: 'javascript',
prop: {
getFullName: function () {
return this.fullName
}
}
}
console.log(obj.prop.getFullName())
//调用函数为getfullname,此时的this指向的是prop,而prop里面没有getfullname,所以此时得到的值也就是undefined
var test = obj.prop.getFullName
//将obj下面的prop下面的函数赋给变量test
console.log(test())
//调用函数test,此时的this指向的是window,所以此时输出的结果也就是language
var name = 'window'
var Tom = {
name: "tom",
show: function () {
console.log(this.name)
//此时的this指向的是window,所以得到的值也就是window
},
wait: function () {
var fun = this.show
//这里的this.show指向上方show函数
fun()
//再次调用函数
}
}
Tom.wait()
//调用函数对象名为Tom下面的wait