您的位置:首页 > Web前端 > JavaScript

JavaScript语言精粹(一)(词法作用域,JSON及其服务器处理,document.write()与document.writeln()区别)

2017-04-21 16:39 513 查看

Why JavaScript?

因为它是Web浏览器的语言。

因为它使一门拥有极强表达能力的语言。

浏览器的API和文档对象模型(DOM)相当糟糕—Q:怎么糟糕了?—连累JavaScript遭到不公平的指责。

Analyzing JavaScript

优秀的想法:函数;弱类型;动态对象;对象字面量表示法。

糟糕的想法:基于全局变量的编程模型。

1.函数

JS中函数基于词法作用域-lexical scoping。

词法作用域在书写代码或者声明时确定的,而动态作用域在运行时确定的。例如:

function static(){
alert(foo);
}
function dynamic(){
var foo = 3;
static();
}

var foo = 1;
dynamic();//弹出1
alert(foo);//弹出1


来自知乎用户的解释更深入,有助于理解:

动态作用域就是整个程序运行的时候只有一个env。

什么是env呢?env就是一组binding。

binding是什么呢?binding就是从identifer到value的映射。

dynamic scope在每次函数求值的时候都会在这唯一的一个env里查询或更新。

而static scope是每次函数求值的时候都创建一个新的env,包含了函数定义时候的所能访问到的各种binding。这个新的env连同那个函数一起,俗称闭包Closure。

链接:https://www.zhihu.com/question/20032419/answer/49183240

2.弱类型

无需建立复杂的类层次,永远不用做强制转换,也不用应付类型系统以得到想要的行为。

3.对象字面量表示法

JSON的灵感来源,成为流行的数据交换格式。

Json是一种文本格式,可以被人和机器阅读。Json是一种极简的,轻便的和文本式的JS子集。通常用于与服务端交换数据。例如:{ “name”:”runoob”, “alexa”:10000, “site”:”www.runoob.com” }

Json有6种类型的值:对象,数组,字符串,数字,布尔值和特殊值null。大多数语言的数据结构都可以映射成Json对象或者Json数组。

在接受服务器数据时一般是字符串,使用JSON.parse()方法将数据转化为JS对象。例如:

var text = '{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }';


var obj = JSON.parse(text);


document.getElementById("demo").innerHTML = obj.name + ":" + obj.site;


使用 XMLHttpRequest 来获取Json文件内容

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
myObj = JSON.parse(this.responseText);
document.getElementById("demo").innerHTML = myObj.name;
}
};
xmlhttp.open("GET", "/try/ajax/json_demo.txt", true);
xmlhttp.send()


4.原型继承

JS是一个无类型的对象系统,对象直接从其它对象继承属性。

5.糟粕:JS依赖于全局变量进行连接

解决方案:闭包等

其它知识点:

1.document.write() 和 document.writeln() 的区别

//JS代码:
document.write("Hello,world ");
document.write("Hello,world ");
document.write("\n");
document.writeln("Hello,world ");
document.writeln("Hello,world ");
document.write("<pre>");
document.writeln("Hello,world ");
document.writeln("Hello,world ");
document.write("</pre>");


//检查元素
<body>
"Hello,world Hello.world
Hello,world
Hello,world
"
<pre>Hello,world
Hello,world
</pre>
</body>


效果展示



2.用method方法去为所有的函数定义新方法

Function.prototype.method = function(name, func){
this.prototype[name] = func;
return this;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息