语言:程序最终被表达为数据(结构)和逻辑(算法),命令式和说明式/函数式语言分别从这两方面分类;

动态:在语言陈述时无法确定,必须在计算机执行时才能确定语言关系;JS是完全动态语言,导致其不确定性一般包括:

  • 标识符确定:表现为动态类型,动态重写,动态存取数据结构;
  • 语句上下文确定:表现为动态变量/语法作用域,闭包作用域;

起源:

  • 动态数据类型:

    • 动态类型声明(动态类型绑定):语言变量是无类型的,只有在赋值后才有某种类型;
    • 动态空间分配(动态数据绑定):变量在赋值时才会分配空间;
  • 动态执行系统:
    • 编译器:将代码翻译成计算机可以理解的二进制代码;
    • 解释器:解释执行的语言系统,之后用一个执行环境读入并执行这份代码;
    • 动态执行系统一般依赖于解释和及时编译系统;目前JS一般采用虚拟执行环境+即使编译系统+语言引擎;

动态执行:   //动态执行系统分别动态加载和动态执行;JS中动态执行主要是eval()带来的效果;

动态方法调用:

  • JS中的执行体:

    • eval()函数入口指定的字符串,该字符串总是被作为当前函数上下文的语句来执行;
    • new Function()中传入的字符串,该字符串总是被作为一个全局,匿名函数闭包中的语句行被执行;
    • 执行体就是一个函数,通过()来执行;
  • 指定this对象: //call,apply,bind
    function calc_area(w, h) {
    console.log(w * h);
    }
    function Area() {
    this.name = 'MyOject';
    }
    Area.prototype.doCalc = function() {
    calc_area.apply(this,arguments);
    }
    var area = new Area();
    area.doCalc(10,20); //200
    Area.prototype.doCalc = function(v1) {
    var slice = Array.prototype.slice;
    calc_area.apply(this,[v1*2].concat(slice.call(arguments,1)))
    }
    area.doCalc(10,20); //400
  • 栈的可见与修改:
    function func_1() {};
    function func_2() {
    func_1.apply(this,arguments);
    }
    func_2();

    如上,在func_1.apply()被调用时,arguments被做了一次复制,值数值被复制,引用数据被创建引用,所以其实func_1与func_2中操作的arguments是两套数据;但是可以这样进行修改:

    function func_1() {
    arguments.callee.caller.arguments[0] = 100;
    }
  • bind() //bind方法绑定的函数做构造函数构造出来的对象即是绑定后的函数的实例,也是绑定前函数的实例;

重写://JS的重写是一个代码执行期的行为,语法分析期时引擎不会做任何预期或限制;其可能的问题是在运行期中会发现冲突或因为错误意外重写导致不可预料的代码逻辑错误;

  • 原型重写: //无法保证JS中,对象和其构造器必然存在某种相似性;其实重写原型已经违背了面向对象系统的基本原则;所以原型重写会导致同一个构造器可能有多套原型系统;
function MyOject_0() {}
var obj_1 = new MyOject_0(); MyOject_0.prototype = {
constructor: MyOject_0
}
var obj_2 = new MyOject_0(); console.log(obj_1 instanceof MyOject_0); //false
console.log(obj_2 instanceof MyOject_0); //true
  • 构造器重写:

    //执行期,重写变量
    function MyObject_2() {};
    var obj1 = new MyObject_2;
    MyObject_2 = function() {};
    var obj2 = new MyObject_2; console.log(obj2 instanceof MyObject_2); //true
    console.log(obj1 instanceof MyObject_2); //false //语法分析期,标示符覆盖
    function MyObject_3() {};
    var obj1 = new MyObject_3;
    function MyObject_3() {};
    var obj2 = new MyObject_3; console.log(obj2 instanceof MyObject_3); //true
    console.log(obj1 instanceof MyObject_3); //true

      

js:语言精髓笔记11--动态语言特性(1)的更多相关文章

  1. js:语言精髓笔记12--动态语言特性(2)

    对于括号内: 通过赋值时发生的重写: (Object1 = function() {}).prototype.value = 100; var obj1 = new Object1; console. ...

  2. js:语言精髓笔记7----原型继承

    面向对象有三个基本特性:封装,继承,多态:如果都满足的话称为面向对象语言:而部分满足则称为基于对象语言: 数据类型实现模型描述: JavaScript对象模型: 构造过程:函数->构造器 构造器 ...

  3. js:语言精髓笔记8--对象系统

    封装: 一把对象系统,封装是由语法解析来实现的,即语法作用域:但js是动态语言,因此只能依赖变量作用域: js的变量作用域只有表达式,函数,全局三种:所以js只能实现public和private两种封 ...

  4. Go语言学习笔记(一) [Go语言的HelloWorld]

    日期:2014年7月18日   1.简介     Go 编程语言是一个使得程序员更加有效率的开源项目.Go 是有表达力.简 洁.清晰和有效率的.它的并行机制使其很容易编写多核和网络应用,而新奇的类型系 ...

  5. C语言学习笔记一---C语言概述

    一.编程语言与解释语言 1.程序的执行 a.解释:借助一个能试图理解程序的程序,使计算机按要求执行你自己写的程序 b.编译:将所写程序翻译为机器语言写的程序,使计算机按要求执行你自己写的程序 2.两者 ...

  6. js:语言精髓笔记9--函数式语言特征

    形式化运算系统的研究: 图灵:提出图灵机形式系统,通过0,1运算系统来解决复杂问题: 冯诺依曼:提出了冯诺依曼体系:即通过修改内存反映运算结果: 阿隆左.丘奇:提出新的运算范型Lambda演算,计算机 ...

  7. js:语言精髓笔记5----语言分类

    计算模型:源于对计算过程的不同认识: 1.基于不同计算模型一般分为://教科书的一般分类 命令式语言: 函数式语言: 逻辑式语言: 面向对象程序设计语言: 2.基于程序本质分类:  //编程的经典法则 ...

  8. js:语言精髓笔记1--标识符与基本类型

    标识符: 命名: 语法以及类型----语法关键字                                           //逻辑 值(的存储位置)----变量和常量           ...

  9. js:语言精髓笔记10--闭包

    闭包:  //JS函数式风格中,在内部保存数据和对外无副作用这两个特性主要就是通过闭包实现的: 函数与闭包: 一个函数是一段静态代码,它是一个代码书写时已经编译期,静态概念:闭包是函数在代码运行过程中 ...

随机推荐

  1. [转] Android开发者必备的42个链接

    下面收集了42个帮助大家学习Android的内容链接,部分内容是面向初学者的,帮助大家从头开始学习Android开发,其他则面向较高级的开发者.希望推荐的这些内容对你有帮助. 官方网站 1.谷歌And ...

  2. JavaScript中的Function(函数)对象详解

    JavaScript中的Function对象是函数,函数的用途分为3类: 作为普通逻辑代码容器: 作为对象方法: 作为构造函数. 1.作为普通逻辑代码容器 function multiply(x, y ...

  3. Linux简单的常用命令——纯手打(慢慢积累)

    ==============linux下快捷键==================ctrl+insert 复制shift +insert 粘贴 输入文件名的前三个字母,按tab键自动补全文件名 在vi ...

  4. Win10走红背后,最开心的人却是谷歌

    导读 微软在不惜余力推进Windows10普及的同时,也有一些让自己小小郁闷的事儿发生,在Win10系统当中,微软用新的Edge浏览器取代了用户熟悉的IE浏览器,以求改写在浏览器市场上的被动局面,不过 ...

  5. Unity3D开发之NGUI点击事件穿透响应处理

    http://www.xuebuyuan.com/1936292.html 在使用NGUI 开发2D项目的时候,发现了一个问题,就是如果点出一个菜单,然后点击菜单上面的按钮的时候就会使得按钮下面的物品 ...

  6. 关于Unity3D中Resources动态加载NGUI图片的方法

    在NGUI中有些图片我需要动态进行变更或者加载,怎么办? 首先在项目中创建一个Resources目录,接着把需要的图片放在这里面,可以有子文件夹么?当然可以,文件结构很重要哦~ NGUI加载图片的方法 ...

  7. 关于NGUI的动态加载后的刷新显示问题,解决办法!!

    http://momowing.diandian.com/post/2012-09-06/40038001275 最近碰NGUI用到它的动态列表功能(ps:就是加东西,删除东西).我这里用的是UIDr ...

  8. HTML5 自制本地网页视频播放器

    HTML5初试:本地视频用网页打开啦半个广告都可以没有,看来暴风什么的快要淘汰了. 视频格式还是有要求的,看来要备一个转码器. 格式 IE Firefox Opera Chrome Safari Og ...

  9. 大数据之ETL设计详解

    ETL是BI项目最重要的一个环节,通常情况下ETL会花掉整个项目的1/3的时间,ETL设计的好坏直接关接到BI项目的成败.ETL也是一个长期的过程,只有不断的发现问题并解决问题,才能使ETL运行效率更 ...

  10. android menu showAsAction属性

    app中有一个菜单(menu),showAsAction主要是针对这个菜单的显示起作用的,它有三个可选项:always:总是显示在界面上 never:不显示在界面上,只让出现在右边的三个点中 ifRo ...