js基础

变量对象的创建过程

在同一执行上下文中,变量对象的创建过程
将所有的函数声明放入变量对象中,如果属性已存在,则被新的覆盖
将所有的变量声明放入变量对象中,如果属性已存在,为了防止同名的函数被修改为undefined,
则会直接跳过,原属性值不会被修改,然后开始执行阶段代码的执行


this
在一个函数的作用域中,this由调用者提供,由调用函数的方式来决定,如果调用者函数,被某一个函数所拥有,那么该函数在调用时,
内部的this指向该对象,如果函数独立调用,那么该函数内部的this,则指向undefined,但是在非严格模式下,当this指向undefined时,
它被自动指向全局对象.

 

通过new操作符调用构造函数,会经历以下4个阶段
1.创建一个新的对象
2.将构造函数的this指向这个新对象
3.指向构造函数的代码,为这个对象添加属性,方法等
4.返回新对象
因此,当new操作符调用构造函数时,this其实指向的是新创建的对象
最后又将新的对象返回出来,被实例对象p1接收.因此,我们可以说,
这个时候,构造函数的this,指向了新的实例对象,p1

断点调试
函数在被调用执行时,会创建一个当前函数的执行上下文,在执行上下文的创建阶段
变量对象,作用域链,闭包,this指向会分别被确定.而一个javascript程序中一般来说
会有多个函数,javascript引擎使用函数调用栈管理这些函数的调用顺序.函数调用栈的
调用顺序与栈数据结构一致

闭包:
1.在函数内部创建新的函数
2.新的函数在执行时,访问了函数的变量对象

闭包是指这样的作用域(foo),它包含有一个函数(fn1),
这个函数(fn1)可以调用被这个作用域所封闭的变量(a)、函数、或者闭包等内容。
通常我们通过闭包所对应的函数来获得对闭包的访问。

1.闭包是在函数被调用执行的时候才被确确认创建的
2.闭包的形成,与作用域的访问顺序有直接关系
3.只有内部函数访问了上层作用域链中的变量对象时,才会形成闭包,因此,
我们可以利用闭包来访问函数内部的变量

函数与函数式编程
一:函数声明,函数表达式,匿名函数与自执行函数
在js中,有两种声明方式,一个是使用var的变量声明,一个是使用function的函数声明
变量对象在创建过程中,函数声明具有优先的执行顺序,即函数声明提前,因此我们再执行上下文中
无论在什么位置声明了函数,我们都可以在同一个执行上下文中直接使用该函数

 

js的隐式全局变量和显示全局变量

       var a = 10;
            console.log(window)
            function fn(){
                return a1=2
            }
            fn()
            delete a
            delete a1
            console.log(window)

上例,a 是 var声明的全局变量,a1是函数返回的隐式的全局变量,

使用delete操作符,变量a未被删除,a1被删除。

 

构造函数 ,实例,原型

我们创建的每一个函数,都可以有一个prototype属性,该属性指向一个对象。这个对象,就是我们这里说的原型。
当我们在创建对象时,可以根据自己的需求,选择性的将一些属性和方法通过prototype属性,挂载在原型对象上。
而每一个new出来的实例,都有一个__proto__属性,该属性指向构造函数的原型对象,通过这个属性,
让实例对象也能够访问原型对象上的方法。因此,当所有的实例都能够通过__proto__访问到原型对象时,
原型对象的方法与属性就变成了共有方法与属性。

 

function Fn(){}//构造函数
var a = new Fn(); //实例对象
console.log(Fn.prototype) // 原型对象
console.log(a.__proto__) //实例通过指针找到原型
console.log(a instanceof Fn) //true a是构造函数Fn的实例
console.log(Object.getPrototypeOf(a)) // 返回实例对象a的原型对象

 

posted @ 2018-06-04 14:26  伊优  阅读(139)  评论(0编辑  收藏  举报