引用:对象是通过引用来传递的,它永远不会被复制。
减少全局变量污染。
作用域
词法作用域的函数中遇到既不是形参也不是函数内部定义的局部变量的变量时,去函数定义时的环境中查询。
动态域的函数中遇到既不是形参也不是函数内部定义的局部变量的变量时,到函数调用时的环境中查。
词法作用域(lexical scope)等同于静态作用域(static scope)。所谓的词法作用域其实是指作用域在词法解析阶段既确定了,不会改变。
我们要知道js是遵循静态作用域的。举个例子:
var foo=1;
function static(){
alert(foo);
}
!function(){
var foo=2;
static();
}();
在js中,会弹出1而非2,因为static的scope在创建时,记录的foo是1。
如果js是动态作用域,那么他应该弹出2。请体会一下两者的区别。
另外,借@贺师俊的话,eval 和 with可以产生动态作用域的效果。
strict模式下就完全是static scope了。
作者:杨志
链接:https://www.zhihu.com/question/20032419/answer/13742892
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
调用
javascript一共有4种调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。
以函数模式调用函数时,this 被绑定到全局对象。(这是一个语言设计上的错误。)
var myObj = {val:4}, val=‘a';
myObj.double = function () {
// val = 3;
//var that = this; //解决方法
var helper = function () {
// that.val = add(that.val, that.val);
this.val = add(this.val, this.val);
};
helper(); //以函数的形式调用 helper
}
myObj.double()
document.writeln(myObj.val); //output: 4
document.writeln(typeof this.val); // string
document.writeln(this.val); // aa
一个函数,如果创建的目的就是希望结合 new 前缀来调用,那它就被称为构造器函数。
作用域:js 缺少块级作用域,最好是在函数体的顶部声明函数中可能用到的所有变量。
理解内部函数能访问外部函数的实际变量而无须复制是很重要的。
级联:一些设置或修改对象的某个状态却不返回任何值的方法,让这些方法返回 this 而不是 undefined,就可以启动级联。
let 允许把变量的作用域限制在块级域中。与 var 不同处是:var 申明变量要么是全局的,要么是函数级的,而无法是块级的。
数组:数组也是对象,当属性名为整数时对 length 有效。
todo
模块、柯里化,没有理解
数组指定初始值,矩阵练习
第五章继承中的伪类
函数
slice():切片、split():分离
网友评论