this,笔试真题讲解

  • 函数预编译过程中 this ——》window
  • 全局作用域中 this——》window
  • call/apply 可以改变函数运行时的this指向
  • 谁调用函数,谁就是this
    obj.function(){} function()里面的this指向obj
function test(c) {
            // var this = Object.create(test.prototype); {
            //     __proto__: test.prototype;
            // }
            var a = 123;

            function b() {
                //sjflkjasdlj
            }
        }
        // ao{
        //     a : undefined
        //     b : function(){}
        //     this : window
        //     arguement : [1]
        // }
        test(1);
var name = "222";
        var a = {
            name: "111",
            say: function() {
                console.log(this.name);
            }
        };
        var fun = a.say;
        fun();
        a.say();
        var b = {
            name: "333",
            say: function(fun) {
                fun();
            }
        };
        b.say(a.say);
        b.say = a.say;
        b.say();

在这里插入图片描述
不好理解的是第三个;执行b.say()方法,this指的是b,但是a.say是参数,他是一个函数,函数空执行,没有谁调用!属于预编译,this值windows所以与a,b无关!

arguments

  • arguments.callee
  • function.caller

callee指函数的引用!就是指函数的本身,在初始化工具——立即执行函数中

var jiecheng = (function(i) {
            if (i == 1) return i;
            return i * jiecheng(i - 1);
        })(5);

在这儿,阶乘函数是立即执行函数,里面的想要实现递归,就要调用函数本身!所以就用到了arguments.callee!

var jiecheng = (function(i) {
            if (i == 1) return i;
            return i * arguments.callee(i - 1);
        })(5);

在这里插入图片描述
函数自身的属性 demo.caller指在哪个环境调用!

function test() {
            demo();
        }

        function demo() {
            console.log(demo.caller);
        }
        test();

在es5下不能用callee和caller!

做题吧!

var foo = "123";

        function print() {
            var foo = "456";
            this.foo = "789";
            console.log(foo);
        }
        print();

答案:456

var foo = 123;

        function print() {
            this.foo = 234;
            console.log(foo);
        }
        print();

答案:234

var foo = 123;

        function print() {
            this.foo = 234;
            console.log(foo);
        }
        new print();

使用new 方法了,那就是print是个构造函数,这是的this指以他的原型创造的对象,要打印的是foo,不是this.foo,所以上go身上找到 —— 123

var a = 5;

        function test() {
            a = 0;
            alert(a);
            alert(this.a);
            var a;
            alert(a);
        }
        test();
        // new test();

0 5 0
0 undefined 0

function print() {
            console.log(foo);
            var foo = 2;
            console.log(foo);
            console.log(hello);
        }
        print();

在这里插入图片描述

function print() {
            var test;
            test();

            function test() {
                console.log(1);
            }
        }
        print();

答案 :1

 function print() {
            var x = 1;
            if (x == "1") console.log("one!");
            if (x === "1") console.log("two!");
        }
        print();

答案 :one!

var bar = {
            a: "002"
        };

        function print() {
            bar.a = "a";
            Object.prototype.b = "b";
            return function inner() {
                console.log(bar.a);
                console.log(bar.b);
            };
        }
        print()();

在这里插入图片描述

var obj = {
            naem: "abc",
            age: 123,
            sex: "famale"
        };
        var obj1 = {};

        function clone(origin, target) {
            for (var prop in origin) {
                target[prop] = origin[prop];
            }
        }
        clone(obj, obj1);

在这里插入图片描述

发布了37 篇原创文章 · 获赞 0 · 访问量 699

猜你喜欢

转载自blog.csdn.net/weixin_43704007/article/details/105023349