唯品秀前端博客

在这个框架肆意的年代,前端娃是越来越淡化js基础了,很多东西也确实在工作中运用场景越来越少,但倘若面对面试,这些基础知识都是无法逃避的现实,下面记录下这几天和群里一起回炉学习的作用域相关知识。

一、关于作用域

1
2
3
4
5
6
7
8
9
10
function b() {
    console.log(a);
    var a = 10;
    function a() { };
    a = 100;
    console.log(a);
}
b();

// 结果:ƒ a() { }和100
1
2
3
4
5
6
7
8
9
10
function c() {
    console.log(a);
    function a() { };
    var a = 10;
    a = 100;
    console.log(a);
}
c();

// 结果同上,依然还是ƒ a() { }和100
1
2
3
4
5
6
7
8
var num = 99;
function d() {
    console.log(num);
    var num = 10;
}
d(100);

// 结果:undefined
1
2
3
4
5
6
7
8
var num = 99;
function d() {
    console.log(num);
    const num = 10;
}
d(100);

// 结果:Uncaught ReferenceError: Cannot access 'num' before initialization
1
2
3
4
5
6
7
(function e(num) {
    console.log(num);
    var num = 10;
    function num() { };
}(100))

// 结果:ƒ num() { }
1
2
3
4
5
6
(function e(num) {
    console.log(num);
    var num = 10;
}(100))

// 结果:100
1
2
3
4
5
6
7
var num = 100;
(function e() {
    console.log(num);
    var num = 10;
}(num))

// 结果:undefined
1
2
3
4
5
6
7
8
9
function b(x, y, z) {
    console.log(z);
    arguments[2] = 10;
    console.log(z)
}
var c = 3;
b(1, 2, c);

结果:310
1
2
3
4
5
6
7
8
9
10
function a(b) {
    var b = 100;
    console.log(b);
    function b() {}
    var b = 100;
    console.log(b);
}
a(10);

// 答案:100和100
1
2
3
4
5
6
7
8
9
function a(b) {
    console.log(b);
    function b() {}
    var b = 100;
    console.log(b);
}
a(10);

// 答案:ƒ b() { }和100
1
2
3
4
5
6
7
8
var a = 10;
function a() {
    console.log(a);
    a = 100
}
a()

// 答案:报错,a不是一个函数,因为此时a=10

二、关于this

1
2
3
4
5
6
7
8
9
10
var x = 10;
function foo() {
    console.log(x)
}
(function () {
    var x = 20;
    foo();
})()

// 答案:10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var length = 88;
function test(){
    console.log('this',this)
    console.log(this.length)
}
var obj = {
    length:99,
    action: function(test){
        test();
        arguments[0]();
    }
}
obj.action(test,1,2,3,4)

// 答案:88和5,前面this指向是window,后面this指向arguments
1
2
3
4
5
6
7
8
9
10
11
12
var length = 88;
function test(){
    console.log(this.length)
}

var obj = {
    length:99,
    action:test
}
obj.action()

// 答案:99
1
2
3
4
5
6
7
8
9
var length = 88;
function test(){
    console.log(this.length)
}

var arr = [test,1,2];
arr[0]();

// 答案:3,this指向arr

三、其它杂项

function是不是js数据类型的一种?我认为是的,虽然网上众说纷纭,但你通过typeof或者intanceof去检测可知,事实上就是真正切切存在这个类型

1
2
console.log(typeof function(){})
console.log(function(){} instanceof Function)

小结

在函数里,单纯从变量申明权重来讲,函数变量名优先级最高 > 局部变量申明 > 函数形参

本站所有文章、图片、资源等如无特殊说明或标注,均为来自互联网或者站长原创,版权归原作者所有;仅作为个人学习、研究以及欣赏!如若本站内容侵犯了原著者的合法权益,可联系我们进行处理,邮箱:343049466@qq.com
赞(3) 打赏

上一篇:

下一篇:

相关推荐

1 条评论关于"js面试题关于js基础的那些坑你还记得多少?"

表情

最新评论

  1. 追风一骑绝尘
    Windows 10 Firefox 56.0

    感谢分享、学习一下、

  2. 暂无留言哦~~
谢谢你请我吃鸡腿*^_^*

支付宝扫一扫打赏

微信扫一扫打赏