zoukankan      html  css  js  c++  java
  • JavaScript编程随笔

    尽管说用JS非常多年了,可是却一直停留在肤浅的阶段,对JS的机制原理依旧是一知半解,比如:闭包。尽管能说出一二。却不能说出三四,确实羞愧。近期恶补一番。并将比較与大家分享,希望对大家有些帮助。



    闭包

    老概念,在JS编程中我们可能在不经意间就用到了它,仅仅是我们不知道而已。

    首先呢,闭包并非一个函数或者类型。而是一直语言机制,假设硬要做个类比的话。我认为它应该属于“继承”这类型的语言机制。

    在JS里面,函数外部是不能直接调用函数内部的变量。假设我们非要调用它们的话,那你就须要闭包,举个样例:

    假设我们想在outerFunc外部调用color变量,那我们就得使用闭包机制,调用方式例如以下

    function outerFunc()
    {
        var color='red';
        function innerFunc(c)
       {
            color=c;
            alert(color);
       }
        return innerFunc;
    }
    
    var tmp=outerFunc();
    tmp('green'); //green



    This

    假设我们调用的对象分别存在多个定义域里面,比如:全局或局部,而且我们在用它的时候还加上了Thiskeyword,那大家就要小心了。这时候我们就须要分辨我们调用的对象究竟是全局的呢,还是局部的呢?

    第一次调用返回的结果是一个包括this.name的函数体,可是我们运行它的定义域确实在全局,全部它会返回’the window'。

    可是第二次调用呢,它的定义域是局部,所以它返回'my object',第三次调用返回的是闭包,所以它的结果当然是它的局部变量值‘my object2'。

     var name = "The Window";
            var object = {
                name: "My Object",
                getNameFunc: function () {
                    return function () {
                        return this.name;
                    };
                }
            };
    
            var object2 = {
                name: "My Object2",
                age: 22,
                gender:'Femal',
                getNameFunc: function () {
                    var name = this.name;
                    return function () {
                        return name;
                    };
                }
            };
    
            alert(object.getNameFunc()());
            object.show = object.getNameFunc();
            alert(object.show());
            alert(object2.getNameFunc()());



    Call 和 Apply

    这两keyword的使用和This有非常大的关系,它们能模拟对象的运行环节,对上面的样例来说,假设我们对第一调用做例如以下改动,那么它返回的结果将是’My Object‘。

            alert(object.getNameFunc().call(object));
            alert(object.getNameFunc().apply(object));
    首先呢,object.getNameFunc()返回的是一个函数体。其次呢,我们通过call和apply在object的定义域内运行返回的函数体,所以返回的值也就不一样了。

    Prototype

    prototype是JS对象的一个内部原型机制。我们能够给它加入属性或方法,这些内容都能被它相应的对象所识别。

    prototype在JS面向对象的编程中用的比較多,基本上都用它来实现对象的继承机制,详细看以下样例。

     function person()
            {
                this.sex = 'male';
                this.age = 21;
                
            }
            person.prototype.introduce = function () {
                console.log('im a ' + this.sex + ' and im ' + this.age + ' years old');
            }
    
            function Jim()
            {
                this.name = 'Jim';
            }
    
            Jim.prototype = new person();
    
            var people = new Jim();
            people.introduce();

    在这里呢,我们成功的将person的全部属性赋值给Jim.prototype了,当然这些东西对Jim对象是全然可见的,大家看,是不是通过这样的方式非常实现JS的单项继承呢?


  • 相关阅读:
    深度学习中的Data Augmentation方法(转)基于keras
    caffe pytho接口
    finetuning caffe
    windows下配置Faster-RCNN
    caffe中的props
    centos上搭建git服务--3
    centos上搭建git服务--2
    Centos上搭建git服务
    loadrunner--基础2
    loadrunner11--基础使用
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7052726.html
Copyright © 2011-2022 走看看