JS经典面试题记录

题目代码:

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(5)
}
Foo.getName()           // 2
getName()               // 4
Foo().getName()         // 1
getName()               // 1
new Foo.getName()       // 2
new Foo().getName()     // 3
new new Foo().getName() // 3

关于上题的解释:

函数1:定义一个有返回值的构造函数

函数2:构造函数的一个属性getName指向一个匿名函数

函数3:构造函数的原型上有个getName方法

函数4:定义一个变量getName指向一个匿名函数

函数5:声明一个叫getName的具名函数

匿名函数:

定义:没有实际名字的函数。

创建一个匿名函数:写一个有名字的函数,然后去掉名字,添加括号。

//匿名函数在其它应用场景括号可以省略
(function (){
    //由于没有执行该匿名函数,所以不会执行匿名函数体内的语句
    console.log("我是匿名函数,不会输出到控制台。")
})

//如果需要执行匿名函数,在匿名函数后面加上一个括号即可立即执行!
(function (){
    console.log("我是匿名函数,会输出到控制台哦!")
})()
//如果需要传值,可以在括号中传值
(function (str){
    console.log(str)
})("我是匿名函数,会输出到控制台哦!")

使用场景:

1、绑定事件,如点击事件。DOM.onclick = function(){}

2、用于对象定义,如:

var obj = {
    a: '0',
    b: function() {
        return '内容'
    }
}

3、函数表达式,如:

//将匿名函数赋值给变量fn。
var fn=function(){
    return "我是匿名函数"
}
//调用方式与调用普通函数一样
console.log(fn()) // 输出:“我是匿名函数”

4、回调函数,常用语定时执行函数,如:

setInterval(function(){
    console.log("我是一个回调函数,每次1秒钟会被执行一次")
},1000)

5、作为返回值,如:

function getName(){
    //返回匿名函数
    return function(){
        return "张三"
    }
}
// 调用匿名函数方法:
// 第一种
console.log(getName()())
// 第二种
var name = getName()
console.log(name())

匿名函数的作用:

1、实现闭包。

2、模拟块级作用域,减少全局变量。(在多人协作的时候,可避免命名问题。)

闭包

闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量。

function demo1(){
    var a = 100
    var demo2 = function(){
        cosole.log(a)
    }
    return demo2
}
// demo2就是一个闭包函数,它能够访问到demo1函数的作用域

 

闭包与声明提升,点击这里

自执行函数,更多点击这里

方式1 :小括号将要执行的函数包裹住

// 方式一
(function demo1(){
    console.log(1);
}()); // 输出1
// 方式二
(function demo2(){
    console.log(2);
})(); // 输出2

方式2 :符号

// 方式一: && 与操作
true && function () { console.log("true &&") } ();

// 方式二: || 或操作
false || function () { console.log("true ||") } ();

// 方式三: , 逗号
0, function () { console.log("0,") } (); 

// 方式四: 还有一元操作符(! ~ - + )
!function () { console.log("!"); } (); //"!"
~function () { console.log("~"); } (); //"~"
-function () { console.log("-"); } (); //"-"
+function () { console.log("+"); } (); //"+"

// 方式五: 赋值符号 =
//此处 要注意区分 i 和 j 不同之处。前者是函数自执行后返回值给 i ;后者是声明一个函数,函数名为 j
var i = function () { console.log("output i:"); return 10; } (); // "output i:"
var j = function () { console.log("output j:"); return 99;}
console.log(i); // 10
console.log(j); // ƒ () { console.log("output j:"); return 99;}
// 也可以写成这样
var i2 = (function () { console.log("output i2:"); return 10; } ()); // "output i2:"
    var i3 = (function () { console.log("output i3:"); return 10; }) (); // "output i3:"


// 方式六: new关键字
// 注意:采用new方式,可以不要再解释花括弧 `}` 后面加小括弧 `()` 
new function () {
    console.log("new");
} //"new"
new function (a) {
    console.log(a);
} ("new"); //"new"

当闭包与自执行函数放在一起的时候,该如何分析?点击这里

例子:setTimeout与fn()匿名函数放在一起

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值