javascript高级程序设计一(80-116)
81、函数内部属性:arguments、arguments.callee、this。
window.color = "red";
var o={color:"blue"};
function sayColor()
{
alert(this.color);
}
sayColor(); // red
o.sayColor = sayColor;
o.sayColor(); // blue
函数的名字仅仅是一个包含指针的变量而已。因此,即使是在不同的环境中执行,全局的sayColor()函数与o.sayColor指向的是同一个函数。
82、caller:保存着调用当前函数的函数的引用。
83、函数的属性,方法。函数都包含两个属性:length和prototype。
length:表示希望接收命名参数的个数。
prototype:是保存它们所有实例方法的真正所在。
prototype属性不可枚举,fot-in 无法发现。
84、每个函数都包括两个非继承而来的方法:apply()和call()。在特定作用域中调用函数。作用相同,区别在接收函数的参数的方式不同。
function sum(num1, num2)
{
return num1+num2;
}
function callSum1(num1,num2)
{
return sum.apply(this, arguments); //this因为在全局在调用,调用的window
}
function callSum2(num1,num2)
{
return sum.apply(this,[num1,num2]);
}
alert(callSum1(10,10)); //
alert(callSum2(10,10)); //
function callSum(num1,num2)
{
return sum.call(this,num1,num2);
}
alert(callSum(10,10)); //
85、apply()和call()真正强大的是它们可以扩充函数的作用域。
window.color = 'red';
var o={color:"blue"};
function sayColor()
{
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); // blue
86、使用call() 和 apply()来扩充作用域的最大好处,就是对象不需要与方法有任何耦合。
87、bind():创建一个函数实例,其this值会被绑定到传给bind()函数的值。
window.color = 'red';
var o = {color:'blue'};
function sayColor()
{
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); // blue
基本包装类
88、引用类型和基本类型的区别: 生存周期
使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中,
自动创建的基本类型的对象,在存在于一行代码执行的瞬间。
var s1 = "some text";
s1.color = "red";
alert(s1.color); // undefined
Boolean类型
89、
Number类型
90、与boolean类型和string等所有基本类型一样,
重新了valueOf、toLocaleString、toString方法。
重写后valueOf返回基本类型的数组。
Number类型提供了一些将数值转化为字符串的方法toFixed。
String类型
91、length、charAt和charCodeAt:都接受一个参数,基于0字符的位置。concat:将一个火多个字符拼接起来。
92、slice、substring、substr、slice、substring、substr
var stringValue = 'hello world';
alert(stringValue.slice(3)); // lo world
alert(stringValue.substring(3)); // lo world
alert(stringValue.substr(3)); // lo world
alert(stringValue.slice(3,7)) // lo w
alert(stringValue.substring(3,7)) // lo w
alert(stringValue.substr(3,7)) // lo worl
93、indexOf, lastIndexOf, trim
94、toLowerCase、toLocaleLowerCase、toUpperCase、toLocaleUpperCase、大小写转换方法。
95、字符串模式匹配方法。match:只接受一个参数,要么是一个正则表达式,要么是RegExp对象。返回一个数组。
- sharch:查找。
- replace:替换。
- split:字符串分割。
- localeCompare:字符串比较方法。
Global和Math对象
96、不依赖宿主环境的单体内置对象:Global和Math对象。
97、Global对象:isNaN、isFinite、parseInt、parseFloat。
98、url编码方法:encodeURI和encodeURIComponent对URI进行编码。decodeURI和decodeURIComponent解码。
99、eval:就像一个ECMA解析器。(小心代码注入)。
100、Global的属性:undefined、Nan、等,所有原生态引用类型:Object、Functon、Global等对象都是Global的属性。
101、window对象:大多情况ECMA不能直接访问Global对象,Web浏览器实现了承担该角色的window对象。
102、Math对象:min和max方法。ceil、floor、round、方法。random:随机数。
面向对象
//对象1
var person = new Object();
person.name = 'Nicholas';
person.age = 29;
person.job = "Software Engineer";
person.sayName = function()
{
aerlt(this.name);
}
//对象2
var person = {
name:“Nicholas”;
age:29;
job:"Software Engineer";
sayName : function()
{
alert(this.name);
}
}
属性类型
var person={};
Object.defineProperty(person, "name",{
writable:false,
value:"Nicholas"
});
alert(person.name);
//Nicholas;
person.name = "Greg";
alert(person.name);
//Nicholas;
var book = {
_year : 2004,
edition : 1
};
Object.defineProperty(book,"year", {
get : function() {
return this._year;
},
set : function(newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition); //
定义多个属性:Object.definePro-Perties()。
构造函数模式
110、new创建实例的步骤:1、创建一个新对象。2、将构造函数的作用域给新对象(因此this就指向了这个新对象);3、执行构造函数中的代码(为这个新对象添加属性)4、返回新对象。
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
alert(this.name);
};
} var person1 = new Person('nic', 29, 'So');
var person2 = new Person('gre', 27, 'Doct');
// person的构建造函数是Person
alert(person1.constructor == Person);
alert(person2.constructor == Person);
//检测person的对象类型
alert( person1 instanceof Object);
//true
alert( person1 instanceof Person);
//true
111、构造函数模式缺点:每个方法都有在每个实例上重新创建一遍。解决方案是原型模式。
原型模式
function Person() {
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function() {
alert(this.name);
};
var person1 = new Person();
person1.sayName();
// Nicholas var person2 = new Person(); person2.sayName();// Nicholas
// person1 与 person 继承了都继承了原型的sayName方法
alert(person1.sayName === person1.sayName);
//true
//person1、person是两个独立的对象,它们有相同的原型。ecma中函数也是对象。
alert(person1.__proto__ == person2.__proto__);
// true
//
alert(Person.__proto__);
//函数的原型是一个函数体
//
alert(person1.__proto__);
//原型是一个对象。
//
alert(Person.prototype.isPrototypeOf(person1));
//true
alert(Person.prototype.isPrototypeOf(person2));
//true
//它们内部都有一个指向Person.prototype的指针。
function Person() {
};
//
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
//
Person.prototype.sayName = function() {
alert(this.name);
};
//
var person1 = new Person();
var person2 = new Person();
//
alert(person1.hasOwnProperty("name"));
// false
alert("name" in person1);
// true
//
person1.name = "Greg";
alert(person1.name);// Greg -- 来自实例
alert(person1.hasOwnProperty("name"));// true
alert("name" in person1);// true
//
alert(person2.name);// Nicholas --来自原型
alert(person2.hasOwnProperty("name"));// false
alert("name" in person2);//true
//
delete person1.name;
alert(person1.name);
//Nicholas -- 来自原型
alert(person1.hasOwnProperty("name"));
// false
alert("name" in person1);
//true
113、hasPrototypeProperty()的用法。 ( 火狐中没有这个函数)
114、Object.keys():参数一个对象,返回所以可枚举属性的字符串数组。如果你要得到所有实例属性,无论它是否可以枚举,都可以使用
function Person() {
};
Person.prototype.name = 'ni';
Person.prototype.age = 19;
Person.prototype.job = 'Software';
Person.prototype.sayName = function() {
alert(this.name);
};
//
var keys = Object.keys(Person.prototype);
//枚举实例的属性
alert(keys);//name,age,job,sayName
//
var p1 = new Person();
p1.name = 'ROB';
p1.age = 31;
var p1keys = Object.keys(p1);
alert(p1keys);//"name,age"
var keys = Object.getOwnPropertyNames(Person.prototype);// 枚举实例所以得属性,包括不可见的
alert(keys);// constructor,name,age,job,sayName
更简单的原型语
function Person() {
};
Person.prototype = {
name : "Nicholas",
age : 29,
job : "Software Engineer",
sayName : function() {
alert(this.name);
}
};
var friend = new Person();
alert( friend instanceof Object);//true
alert( friend instanceof Person);//true
alert(friend.constructor == Person);//false
alert(friend.constructor == Object);//true
http://hi.baidu.com/fmyppjcxknfpvyr/item/d14e951e94bc5efd9d778a5e
定义:
1、闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。
2、闭包就是就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配。(这个不是官方定义,但是这个定义应该更有利于你理解闭包)
3、当在一个函数内定义另外一个函数就会产生闭包。
理解:
做为局部变量都可以被函数内的代码访问,这个和静态语言是没有差别。闭包的差别在于局部变变量可以在函数执行结束后仍然被函数外的代码访问。这意味着函数必须返回一个指向闭包的“引用”,或将这个”引用”赋值给某个外部变量,才能保证闭包中局部变量被外部代码访问。当然包含这个引用的实体应该是一个对象,因为在Javascript中除了基本类型剩下的就都是对象了。可惜的是,ECMAScript并没有提供相关的成员和方法来访问闭包中的局部变量。但是在ECMAScript中,函数对象中定义的内部函数(inner function)是可以直接访问外部函数的局部变量,通过这种机制,我们就可以以如下的方式完成对闭包的访问了。
function greeting(name) {
var text = 'Hello ' + name;
// local variable
// 每次调用时,产生闭包,并返回内部函数对象给调用者
return function() {
alert(text);
};
} var sayHello = greeting("Closure");
sayHello(); // 通过闭包访问到了局部变量text
上述代码的执行结果是:Hello Closure,因为sayHello()函数在greeting函数执行完毕后,仍然可以访问到了定义在其之内的局部变量text。
好了,这个就是传说中闭包的效果,闭包在Javascript中有多种应用场景和模式,比如Singleton,Power Constructor等这些Javascript模式都离不开对闭包的使用.
//
用处:一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
function f1(){
var n=999;
function f2(){
alert(n);
};
return f2;
}
var result=f1();
result(); //
function f1(){
var n=999;
nAdd=function(){n+=1};
function f2(){ alert(n);};
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); //
var name = "The Window";
var object = {name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()); //function(){retturn this.name}
alert(this.name); // the window
alert(object.getNameFunc()()); //the window
this对象
var name = 'the wiondw';
var object = {
name : 'My Object',
getName : function() {
return this.name;
}
};
alert(object.getName());//my object
alert((object.getName)()); //my object alert(object.getName);
alert((object.getName = object.getName)()); // this window //先执行一条赋值语句,然后再调用赋值后的结果。因为这个赋值表达式的值是函数本身,所以this的值不能得到维持。
块级作用域
116、for中变量i的定义是在函数内,for结束,i不会被销毁。域名函数可以来避免这个问题。
这种做法可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。只要函数执行完毕,就可以立即销毁其作用域链。
javascript高级程序设计一(80-116)的更多相关文章
- 读书笔记(02) - 可维护性 - JavaScript高级程序设计
编写可维护性代码 可维护的代码遵循原则: 可理解性 (方便他人理解) 直观性 (一眼明了) 可适应性 (数据变化无需重写方法) 可扩展性 (应对未来需求扩展,要求较高) 可调试性 (错误处理方便定位) ...
- 《JavaScript高级程序设计(第3版)》笔记-序
很少看书,不喜欢看书,主要是上学时总坐不住,没有多大定性,一本书可以两天看完,随便翻翻,也可以丢在角落里几个月不去动一下. 上次碰到了<JavaScript高级程序设计(第3版)>感觉真的 ...
- 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介
前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...
- 【javascript学习——《javascript高级程序设计》笔记】DOM操作
DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口).DOM描绘了一个层次节点树,允许开发人员添加.移除和修改. 1.节点层次 <html> <head& ...
- 读javascript高级程序设计00-目录
javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...
- 《JavaScript高级程序设计》读书笔记--前言
起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...
- 阅读摘录《javascript 高级程序设计》01
前言: 因为工作需要,所以开始主攻前台JS方面的技术.在以前的工作中,使用过这门脚本语言.但是都是比较凌乱的,用到什么学什么,只是为了实现业务,而去使用. 不会考虑到代码优化,封装对象等.今次特意借了 ...
- 《JavaScript高级程序设计》学习笔记(5)——面向对象编程
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object ...
- 《JavaScript高级程序设计》学习笔记(4)——引用类型
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第五章内容. 在ECMAScript中, ...
- 《JavaScript高级程序设计》学习笔记(3)——变量、作用域和内存问题
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第四章内容. 1.函数:通过函数可以封装 ...
随机推荐
- 线性表之顺序表(C语言实现)
线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一 ...
- leetcode Permutation
Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...
- poj 2393 Yogurt factory(dp+贪心)
奶牛们建了一家酸奶厂,在N周内每周需要出货Y_i单位酸奶,第i周成本为C_i,储存费为每周S.求总体最低成本. 贪心策略是维持每周的最低单位成本,每周可能用上周剩下的,也可能生产新的.于是该周单位成本 ...
- C#基础:事件(一) 【转】
前面简要介绍了委托的基本知识,包括委托的概念.匿名方法.Lambda表达式等,现在讲讲与委托相关的另一个概念:事件. 事件由委托定义,因为事件的触发方(或者说发布方)并不知道事件的订阅方会用什么样的函 ...
- 设置TextView水平居中显示
1.让TextView里的内容水平居中 android:gravity="center_horizontal" 2.让TextView控件在它的父布局里水平居中 android:l ...
- SOA架构有基本的要求
SOA在相对较粗的粒度上对应用服务或业务模块进行封装与重用: 服务间保持松散耦合,基于开放的标准, 服务的接口描述与具体实现无关: 灵活的架构 -服务的实现细节,服务的位置乃至服务请求的底层协议都应该 ...
- ASP.NET MVC 学习之路-5
本文在于巩固基础 数据库开发模式: 1.数据库优先开发模式 2.模型优先开发模式 EntityFramework学习之一 最简单的一个案例 第一步创建模型 public class Student { ...
- C#委托 Lamda表达式
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 一点用JS写控制权限的心得
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Android Studio无法关联Api23源码-提示Souces for android api 23 platform not found
最近升级了As,然后忽然就关联不上源码了,很不方便,找个Activity的源码都只有outline没有解释,还提示这个错误: Decompiled .class file, bytecode vers ...