金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > web前端 > 创建对象的七种方式,全兼容的多列均匀布局问

创建对象的七种方式,全兼容的多列均匀布局问

发布时间:2019-11-01 14:59编辑:web前端浏览(84)

    前端基础进阶(三):变量对象详解

    2017/02/21 · 基础技术 · 变量对象

    原文出处: 波同学   

    图片 1

    开年之后工作热情一直不是很高,这几天一直处于消极怠工状态。早上不想起床,起床了不想上班。明明放假之前工作热情还一直很高,一直心心念念的想把小程序项目怼出来,结果休假回来之后画风完全不一样了。我感觉自己得了严重了节后综合征。还好撸了几篇文章,勉强表示这一周的时间没有完全浪费。这篇文章要给大家介绍的是变量对象。

    在JavaScript中,我们肯定不可避免的需要声明变量和函数,可是JS解析器是如何找到这些变量的呢?我们还得对执行上下文有一个进一步的了解。

    在上一篇文章中,我们已经知道,当调用一个函数时(激活),一个新的执行上下文就会被创建。而一个执行上下文的生命周期可以分为两个阶段。

    • 创建阶段
      在这个阶段中,执行上下文会分别创建变量对象,建立作用域链,以及确定this的指向
    • 代码执行阶段
      创建完成之后,就会开始执行代码,这个时候,会完成变量赋值,函数引用,以及执行其他代码。

    图片 2

    执行上下文生命周期

    从这里我们就可以看出详细了解执行上下文极为重要,因为其中涉及到了变量对象,作用域链,this等很多人没有怎么弄明白,但是却极为重要的概念,因此它关系到我们能不能真正理解JavaScript。在后面的文章中我们会一一详细总结,这里我们先重点了解变量对象。

    有趣的CSS题目(6): 全兼容的多列均匀布局问题

    2016/09/29 · CSS · CSS

    本文作者: 伯乐在线 - chokcoco 。未经作者许可,禁止转载!
    欢迎加入伯乐在线 专栏作者。

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节。

    解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉到生僻的 CSS 属性,赶紧去补习一下吧。

    不断更新,不断更新,不断更新,重要的事情说三遍。

    谈谈一些有趣的CSS题目(1): 左边竖条的实现方法

    谈谈一些有趣的CSS题目(2): 从条纹边框的实现谈盒子模型

    谈谈一些有趣的CSS题目(3): 层叠顺序与堆栈上下文知多少

    谈谈一些有趣的CSS题目(4): 从倒影说起,谈谈 CSS 继承 inherit

    谈谈一些有趣的CSS题目(5): 单行居中,两行居左,超过两行省略

    所有题目汇总在我的 Github 。

     

    JavaScript 创建对象的七种方式

    2017/06/20 · JavaScript · 对象

    原文出处: Xuthus Blog   

    JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以创建单个对象,显然这两种方式会产生大量的重复代码,并不适合量产。接下来介绍七种非常经典的创建对象的方式,他们也各有优缺点。

    图片 3

    变量对象(Variable Object)

    变量对象的创建,依次经历了以下几个过程。

    1. 建立arguments对象。检查当前上下文中的参数,建立该对象下的属性与属性值。
    2. 检查当前上下文的函数声明,也就是使用function关键字声明的函数。在变量对象中以函数名建立一个属性,属性值为指向该函数所在内存地址的引用。如果函数名的属性已经存在,那么该属性将会被新的引用所覆盖。
    3. 检查当前上下文中的变量声明,每找到一个变量声明,就在变量对象中以变量名建立一个属性,属性值为undefined。如果该变量名的属性已经存在,为了防止同名的函数被修改为undefined,则会直接跳过,原属性值不会被修改。

    图片 4

    我知道有的人不喜欢看文字

    根据这个规则,理解变量提升就变得十分简单了。在很多文章中虽然提到了变量提升,但是具体是怎么回事还真的很多人都说不出来,以后在面试中用变量对象的创建过程跟面试官解释变量提升,保证瞬间提升逼格。

    在上面的规则中我们看出,function声明会比var声明优先级更高一点。为了帮助大家更好的理解变量对象,我们结合一些简单的例子来进行探讨。

    JavaScript

    // demo01 function test() { console.log(a); console.log(foo()); var a = 1; function foo() { return 2; } } test();

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // demo01
    function test() {
        console.log(a);
        console.log(foo());
     
        var a = 1;
        function foo() {
            return 2;
        }
    }
     
    test();

    在上例中,我们直接从test()的执行上下文开始理解。全局作用域中运行test()时,test()的执行上下文开始创建。为了便于理解,我们用如下的形式来表示

    JavaScript

    创建过程 testEC = { // 变量对象 VO: {}, scopeChain: {}, this: {} } // 因为本文暂时不详细解释作用域链和this,所以把变量对象专门提出来说明 // VO 为 Variable Object的缩写,即变量对象 VO = { arguments: {...}, //注:在浏览器的展示中,函数的参数可能并不是放在arguments对象中,这里为了方便理解,我做了这样的处理 foo: <foo reference> // 表示foo的地址引用 a: undefined }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    创建过程
    testEC = {
        // 变量对象
        VO: {},
        scopeChain: {},
        this: {}
    }
     
    // 因为本文暂时不详细解释作用域链和this,所以把变量对象专门提出来说明
     
    // VO 为 Variable Object的缩写,即变量对象
    VO = {
        arguments: {...},  //注:在浏览器的展示中,函数的参数可能并不是放在arguments对象中,这里为了方便理解,我做了这样的处理
        foo: <foo reference>  // 表示foo的地址引用
        a: undefined
    }

    未进入执行阶段之前,变量对象中的属性都不能访问!但是进入执行阶段之后,变量对象转变为了活动对象,里面的属性都能被访问了,然后开始进行执行阶段的操作。

    这样,如果再面试的时候被问到变量对象和活动对象有什么区别,就又可以自如的应答了,他们其实都是同一个对象,只是处于执行上下文的不同生命周期。

    JavaScript

    // 执行阶段 VO -> AO // Active Object AO = { arguments: {...}, foo: <foo reference>, a: 1 }

    1
    2
    3
    4
    5
    6
    7
    // 执行阶段
    VO ->  AO   // Active Object
    AO = {
        arguments: {...},
        foo: <foo reference>,
        a: 1
    }

    因此,上面的例子demo1,执行顺序就变成了这样

    JavaScript

    function test() { function foo() { return 2; } var a; console.log(a); console.log(foo()); a = 1; } test();

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function test() {
        function foo() {
            return 2;
        }
        var a;
        console.log(a);
        console.log(foo());
        a = 1;
    }
     
    test();

    再来一个例子,巩固一下我们的理解。

    JavaScript

    // demo2 function test() { console.log(foo); console.log(bar); var foo = 'Hello'; console.log(foo); var bar = function () { return 'world'; } function foo() { return 'hello'; } } test();

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // demo2
    function test() {
        console.log(foo);
        console.log(bar);
     
        var foo = 'Hello';
        console.log(foo);
        var bar = function () {
            return 'world';
        }
     
        function foo() {
            return 'hello';
        }
    }
     
    test();

    JavaScript

    // 创建阶段 VO = { arguments: {...}, foo: <foo reference>, bar: undefined } // 这里有一个需要注意的地方,因为var声明的变量当遇到同名的属性时,会跳过而不会覆盖

    1
    2
    3
    4
    5
    6
    7
    // 创建阶段
    VO = {
        arguments: {...},
        foo: <foo reference>,
        bar: undefined
    }
    // 这里有一个需要注意的地方,因为var声明的变量当遇到同名的属性时,会跳过而不会覆盖

    JavaScript

    // 执行阶段 VO -> AO VO = { arguments: {...}, foo: 'Hello', bar: <bar reference> }

    1
    2
    3
    4
    5
    6
    7
    // 执行阶段
    VO -> AO
    VO = {
        arguments: {...},
        foo: 'Hello',
        bar: <bar reference>
    }

    需要结合上面的知识,仔细对比这个例子中变量对象从创建阶段到执行阶段的变化,如果你已经理解了,说明变量对象相关的东西都已经难不倒你了。

    6、全兼容的多列均匀布局问题

    如何实现下列这种多列均匀布局(图中直线为了展示容器宽度,不算在内):

    图片 5

     

    工厂模式

    function createPerson(name, job) { var o = new Object() o.name = name o.job = job o.sayName = function() { console.log(this.name) } return o } var person1 = createPerson('Jiang', 'student') var person2 = createPerson('X', 'Doctor')

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function createPerson(name, job) {
      var o = new Object()
      o.name = name
      o.job = job
      o.sayName = function() {
        console.log(this.name)
      }
      return o
    }
    var person1 = createPerson('Jiang', 'student')
    var person2 = createPerson('X', 'Doctor')

    可以无数次调用这个工厂函数,每次都会返回一个包含两个属性和一个方法的对象

    工厂模式虽然解决了创建多个相似对象的问题,但是没有解决对象识别问题,即不能知道一个对象的类型

    全局上下文的变量对象

    以浏览器中为例,全局对象为window。
    全局上下文有一个特殊的地方,它的变量对象,就是window对象。而这个特殊,在this指向上也同样适用,this也是指向window。

    JavaScript

    // 以浏览器中为例,全局对象为window // 全局上下文 windowEC = { VO: window, scopeChain: {}, this: window }

    1
    2
    3
    4
    5
    6
    7
    // 以浏览器中为例,全局对象为window
    // 全局上下文
    windowEC = {
        VO: window,
        scopeChain: {},
        this: window
    }

    除此之外,全局上下文的生命周期,与程序的生命周期一致,只要程序运行不结束,比如关掉浏览器窗口,全局上下文就会一直存在。其他所有的上下文环境,都能直接访问全局上下文的属性。

    前端基础进阶系列目录

    前端基础进阶系列我会持续更新,欢迎大家关注我公众号isreact,新的文章更新了我会在公众号里第一时间通知大家。也欢迎大家来简书关注我。

    1 赞 3 收藏 评论

    图片 6

    法一:display:flex

    CSS3 弹性盒子(Flexible Box 或 Flexbox),是一种布局方式,当页面需要适应不同的屏幕大小以及设备类型时,它依然能确保元素拥有更恰当的排布行为。

    当然 flex 布局应用于移动端不错,PC 端需要全兼容的话,兼容性不够,此处略过不谈。

    构造函数模式

    function Person(name, job) { this.name = name this.job = job this.sayName = function() { console.log(this.name) } } var person1 = new Person('Jiang', 'student') var person2 = new Person('X', 'Doctor')

    1
    2
    3
    4
    5
    6
    7
    8
    9
    function Person(name, job) {
      this.name = name
      this.job = job
      this.sayName = function() {
        console.log(this.name)
      }
    }
    var person1 = new Person('Jiang', 'student')
    var person2 = new Person('X', 'Doctor')

    没有显示的创建对象,使用new来调用这个构造函数,使用new后会自动执行如下操作

    • 创建一个新对象
    • 这个新对象会被执行[[prototype]]链接
    • 这个新对象会绑定到函数调用的this
    • 返回这个对象

    使用这个方式创建对象可以检测对象类型

    person1 instanceof Object // true person1 instanceof Person //true

    1
    2
    person1 instanceof Object // true
    person1 instanceof Person //true

    但是使用构造函数创建对象,每个方法都要在每个实例上重新创建一次

    本文由金沙国际官网发布于web前端,转载请注明出处:创建对象的七种方式,全兼容的多列均匀布局问

    关键词:

上一篇:常见的2D碰撞检测,前端基础进阶

下一篇:没有了