• JavaScript原型与闭包相关


    1什么是对象

    js中的值分为引用值和原始值 

    原始值:undefined  null  Boolean  string  number  原始值无法更改 存放在栈中

    引用值:Array  Object  Function                             引用值可更改 指向引用值的指针存放在栈中 数据存放在堆中 当相互赋值时 只是把栈中的指针赋给对方

    对象:一切引用类型都是对象,对象是属性的集合

    对象都是通过函数创建的 函数都是对象

    语法糖:指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

    2. 原型 -- prototype

       js函数的默认属性 -- prototype  属性值为一个对象  对象中仅包含constructor  constructor指向函数本身

      Object.prototypt             

    3.隐式原型 --  __proto__

    对象有个默认的属性 __proto__ 他绝对等于创建他的函数的prototype

    即function a () {}

       var b = new a();

       b.__proto__ === a.prototype

       obj.__proto === Object.prototype

    图示

    特例

    Object.prototype也是个对象 但是他的__proto__ 为null;

    另外:__proto__是原型访问器。目前原型访问器,有3类:标准原型访问器Object.getPrototypeOf(object);该访问器,火狐和谷歌差不多都支持。其次,是非标准访问器object.__proto__,对的就是你正在使用的这个,这个访问器,IE不支持,估计也还有其他基于IE内核的浏览器也不支持,所以并不是每一个对象都有它。最后就是通用访问器,object.constructor.prototype去得到原型。

    原型链完整图

    有待进一步理解

    4.typeof()       .. instanceof  ..   

    typeof()是可以判断括号中参数的类型 但只限于原始类型  在引用类型中 他只返回function/object

    A instanceof B 则表示一种继承关系  规则为

                                                                        沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false。

    5.原型链

    访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。

    fn.hasOwnPrototype(item)  可以判断item是fn本身的 还是fn原型链上的    来自Object.prototype的属性

    call  apply等来自js提供的Function.prototype中

    6.执行上下文

    全局变量下:

    变量/函数表达式  --  提前声明  undefined

    函数声明             --   提前声明 并赋值

    this                      --   赋值

    函数下:

    在函数声明的时候,内部的自由变量等就已经确定了其作用域  函数每被调用一次,都会生成一个新的执行上下文

    7.this的指向

    this指向调用该函数的对象   

    注意

     当一个函数被call和apply调用时,this的值就取传入的对象的值

      这种情况下函数f的this仍为window

    8.执行上下文栈

    处于活动状态的执行上下文环境只有一个。

    其实这是一个压栈出栈的过程——执行上下文栈

    9.作用域

    javascript除了全局作用域之外,只有函数可以创建的作用域。

    我们在声明变量时,全局代码要在代码前端声明,函数中要在函数体一开始就声明好。除了这两个地方,其他地方都不要出现变量声明。而且建议用“单var”形式

    作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突

    作用域只是一个“地盘”,一个抽象的概念,其中没有变量。要通过作用域对应的执行上下文环境来获取变量的值  

    作用域中变量的值是在执行过程中产生的确定的,而作用域却是在函数创建时就确定了。

    如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。

    作用域是静态的组织结构,上下文是动态的计算。

    10.自由变量

    在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用域来说,x就是一个自由变量。

    自由变量要到创建这个函数的那个作用域中取值——是“创建”,而不是“调用”

    11.作用域链

    12.闭包

    闭包应用的两种情况:

    函数作为返回值,函数作为参数传递。

    使用闭包会增加内容开销

    笔记总结来源http://www.cnblogs.com/wangfupeng1988/p/4001284.html

    大佬写的很棒

  • 相关阅读:
    ie6 fixed 实现
    javascript 数组 prototype疑问
    深入了解CLR的加载过程
    sql
    关于 vue2.x 的 $attrs 和 $listeners
    VS Code 状态栏颜色修改
    vueelementadmin 安装第三包(npm install)时报错
    前端 JS 问题记录
    浏览器调试工具调试css样式
    浏览器调试固定鼠标悬浮的样式
  • 原文地址:https://www.cnblogs.com/mengmengya/p/9163452.html
Copyright © 2020-2023  润新知