js:语言精髓笔记11--动态语言特性(1)
语言:程序最终被表达为数据(结构)和逻辑(算法),命令式和说明式/函数式语言分别从这两方面分类;
动态:在语言陈述时无法确定,必须在计算机执行时才能确定语言关系;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)的更多相关文章
- js:语言精髓笔记12--动态语言特性(2)
对于括号内: 通过赋值时发生的重写: (Object1 = function() {}).prototype.value = 100; var obj1 = new Object1; console. ...
- js:语言精髓笔记7----原型继承
面向对象有三个基本特性:封装,继承,多态:如果都满足的话称为面向对象语言:而部分满足则称为基于对象语言: 数据类型实现模型描述: JavaScript对象模型: 构造过程:函数->构造器 构造器 ...
- js:语言精髓笔记8--对象系统
封装: 一把对象系统,封装是由语法解析来实现的,即语法作用域:但js是动态语言,因此只能依赖变量作用域: js的变量作用域只有表达式,函数,全局三种:所以js只能实现public和private两种封 ...
- Go语言学习笔记(一) [Go语言的HelloWorld]
日期:2014年7月18日 1.简介 Go 编程语言是一个使得程序员更加有效率的开源项目.Go 是有表达力.简 洁.清晰和有效率的.它的并行机制使其很容易编写多核和网络应用,而新奇的类型系 ...
- C语言学习笔记一---C语言概述
一.编程语言与解释语言 1.程序的执行 a.解释:借助一个能试图理解程序的程序,使计算机按要求执行你自己写的程序 b.编译:将所写程序翻译为机器语言写的程序,使计算机按要求执行你自己写的程序 2.两者 ...
- js:语言精髓笔记9--函数式语言特征
形式化运算系统的研究: 图灵:提出图灵机形式系统,通过0,1运算系统来解决复杂问题: 冯诺依曼:提出了冯诺依曼体系:即通过修改内存反映运算结果: 阿隆左.丘奇:提出新的运算范型Lambda演算,计算机 ...
- js:语言精髓笔记5----语言分类
计算模型:源于对计算过程的不同认识: 1.基于不同计算模型一般分为://教科书的一般分类 命令式语言: 函数式语言: 逻辑式语言: 面向对象程序设计语言: 2.基于程序本质分类: //编程的经典法则 ...
- js:语言精髓笔记1--标识符与基本类型
标识符: 命名: 语法以及类型----语法关键字 //逻辑 值(的存储位置)----变量和常量 ...
- js:语言精髓笔记10--闭包
闭包: //JS函数式风格中,在内部保存数据和对外无副作用这两个特性主要就是通过闭包实现的: 函数与闭包: 一个函数是一段静态代码,它是一个代码书写时已经编译期,静态概念:闭包是函数在代码运行过程中 ...
随机推荐
- 繁华模拟赛 vicent的字符串
#include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...
- bootstrap tab切换如何让鼠标移动自动切换内容
bootstrap集成了很多功能,比如nav-tabs组件,可以将相似的内容集中在一个区块中展示.bootstrap tab切换默认是要点击才会切换的,如何实现鼠标移动就自动切换呢?如下图所示,光标移 ...
- java笔记--关于线程通信
关于线程通信 使用多线程编程的一个重要原因就是线程间通信的代价比较小 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897773.h ...
- vim在选中的几行中查找并替换
(文章是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com) 使用vim编辑器是能带来很大的便捷的,如何替换选中的多行中的某个单词呢. 先选中,按下冒号,左下方 ...
- poj1860 bellman—ford队列优化 Currency Exchange
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22123 Accepted: 799 ...
- HTML前端--各种小案例
掬一捧清水,放逐在江河,融入流逝的岁月,将心洗净; 捻一缕心香,遥寄在云端,在最深的红尘里重逢,将心揉碎; 望一程山水,徘徊在月下,在相思渡口苦守寒冬,将心落寞. 案例一: 隐藏扩展域,并去掉afte ...
- Install ssdb-rocks on CentOS 6
Install ssdb-rocks on CentOS 6 C.C. 发表于 2014年08月10日 20:14 | Hits: 649 为了优化节操精选的弹幕系统,打算更换到Facebook的R ...
- MySQL性能优化的最佳经验
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...
- Quartz作业调度框架
Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度.本 ...
- Minimum Size Subarray Sum
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...