Javascript基本知识(五)
1.面向对象的方式管理图书
<script>
var obj = [
{name:"什么是批判",author:"福柯"},
{name:"飞鸟集",author:"泰戈尔"}
];
function BookManager() {
this.bookList = null;
}
BookManager.prototype = {
constructor:BookManager,
init:function (arr) {
this.bookList = arr || [];
},
addBook:function (bookObj) {
this.bookList.push(bookObj)
},
getBook:function (name) {
for (var i = 0; i < this.bookList.length; i++) {
var obj = this.bookList[i];
if (obj.name == name)
{
return obj;
}
}
return null;
},
updateBookData:function (name,authorName){
var obj = this.getBook(name);
obj.author = authorName;
},
removeBook:function (name) {
var obj = this.getBook(name);
var index = this.bookList.indexOf(obj);
this.bookList.splice(index,1);
}
};
//01 创建对象
var YYManager = new BookManager();
YYManager.init(obj);
console.log(YYManager.bookList);
//02 演示添加操作
YYManager.addBook({name:"花田半亩",author:"田维"});
console.log(YYManager.bookList);
//03 演示查询操作
console.log(YYManager.getBook("花田半亩"));
//04 演示更新操作
YYManager.updateBookData("花田半亩","甜田");
console.log(YYManager.getBook("花田半亩"));;
//05 演示删除操作
YYManager.removeBook("什么是批判");
console.log(YYManager.bookList);
总结:
1. 提供构造函数,在构造函数内部设置实例化属性
2. 把常用的操作提取成对象的是实例方法,写在原型对象上面
3. 提供init方法,用于初始化数据
4. 如果切换了原型对象,需要修正构造器指向
2.严格模式
JS有两种开发模式:严格模式和非严格模式(默认)
严格模式下,以前在默认情况下可能不会出错或者是静默失败或者可以使用的特性,在严格模式下会直接报错。
-
开启严格模式:
在当前作用域的最顶端添加一个字符串:"use strict" -
部分浏览器不支持严格模式,如果支持,当检测到"use strict"时会自动开启严格模式。
-
严格模式的使用注意:
- 所有的变量都必须使用var声明
- 禁止使用with
- 禁止使用八进制
- 禁止使用callee|caller
- 禁止使用eval和arguments作为标识符
- 在if语句中不能声明函数
- 在函数的声明中不能出现同名的参数
- 在对象中不能出现同名的属性
- 在严格模式下arguments的表现略微不同(默认情况下,函数内部重新设置形参的值时,arguments也会跟着改变,他们是共享的;严格模式下,他们相互独立)
- 不能删除全局变量
- this指向被修正(默认情况下,this->window;严格模式下,this->undefined)
-
严格模式书写注意点:
书写格式:
①双引号和单引号都可以 ②分号可以被省略 ③必须全部都是小写字符 ④必须是10个字符
也就是说:"use strict"或"use strict "这种都是错误的。
- "use strict"作用域:全局作用域script和函数作用域。
注意:"use strict";必须放在当前作用域前面,如果放在后面,就不起作用。
3.作用域:变量起作用的范围。
- 块级作用域:在{}括号内,只在{}内部有效,变量在声明他们的代码段之外是不可见的。
js中没有块级作用域(注意:try...catch例外),而是函数作用域。
为什么说js没有块级作用域呢?
eg:<script>
var name = "global";
if(true){
name = "local";
console.log(name); //local
}
console.log(name); //loacal
</script>
如果有块级作用域,if语句将创建局部变量name,并不会修改全局name。但是从输出结果看,js中name就是全局变量,所以JS没有块级作用域。
- 函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是由定义的。
-
词法作用域:当代码写好后,它的作用域就已经确定了。
-
动态作用域:作用域范围在程序运行时才确定。
js本身是词法作用域(例外:with+eval+try...catch)
词法作用域访问规则:
首先在自己的作用域中查找,如果找到,就直接使用;如果没有找到,就在上一级的作用域中查找。
4.变量和函数的提升
(1)js预解析处理:变量和函数的提升(把变量和函数的声明提升在作用域顶端)
(2)具体执行。
1 变量和函数的提升是分作用域的。
注意:01 变量和变量同名时,后面的变量会把前面的同名变量覆盖
02 函数和函数同名时,后面的函数会把前面的同名函数覆盖
03 变量和函数同名时,跟前后位置无关。
2 函数表达式的提升
在提升的时候仅仅只会把var 变量名 提升,不会把整个函数提升。
网友评论