javasrcipt中一切皆对象,大致分为两类,funtion于object,其实还有直接的属性对象,但是我们可以把他归为object类,只代表自身的对象.
内存模型
作为函数式编程语言中最流行的语言,funtion对象的重要性不言而喻,首先我们的理解JavaScript中对象在内存中是怎么储存的.其实很简单,一句话概括,变量名只指向对象的地址,并不直接指向对象的内存空间;
假设有下面一段代码:
funtion caffe(){
this.info="caffe是机器学习的一种框架";
}
var caffe1 = new caffe();
var caffe2 = caffe1;
首先我们创建了一个类,给它的info属性赋值(假如没有则自动创建,有则覆盖),caffe1 中储存这一个caffe事例的内存地址,然后caffe1又把它储存的地址赋值给了caffe2;
然后执行:
caffe2.info="帮助我们快速构建神经元网络的工具";
console.log(caffe1.info)
打印结果为:帮助我们快熟构建神经元网络
也就是说实例只有一个,通过任意变量名改变实例,其他访问到的实例都会是变化的.
创建funtion的写法
funtion log (pargma){
console.log(pargma);
}var log = funtion(pargma){
console.log(pargma);
}
3.(funtion (pargma){
console(pargma);
})(“123”);
ps:后面的括号是直接调用;
var 变量将直接保存在参数数组中,成为funtion级的作用域;(不是块性作用域);
如下代码所示:
funtion caffe(pargma){
if(pargma==true){
var st = "1231232";
}
console.log(st);
}
上面的代码在js中是合法的,原因就像上面所说的,这算一个小tips吧.
例外一个小tips是==和 ===的用法:
==是可以用在不同类型的变量之间比较,js会帮我们自动转换,而 ===只能比较同类型 ,假如是不同类型的直接返回false;
变量作用域
因为在js中函数也是对象,因此在函数中嵌套函数就完全没有问题了,前面我们知道了var变量会是funtion级作用域,那我嵌套情况下的变量作用域是怎么样的呢?
funtion java(){
var string ="java";
funtion python(){
var string="python";
console.log(string);
}
python();
}
java();
打印结果为:python
其实嵌套的funtion变量作用域规则则与块级作用域是相似的,存放参数时类似于栈,先放最外面的变量,一层一层递进到最内层,到了调用的时候,便从栈顶搜索变量.
这其实容易和函数中调用子函数搞混,这里便有一个需要理解的概念,作用域链,在函数声明创建作用域链,调用是并不会作用域链,作用域链的建立便和上述类似栈的过程一样;
var string="123";
funtion java(){
console.log(string)
}
funtion python(){
var string = "123123";
java();
}
python():
打印结果为:123
可以看到java 使用的全局变量,并没有使用Python函数中的局部变量,这是因为java()函数的作用域链中并没有这个局部变量,自然是不会调用的.
闭包
js中函数作为对象会保存在内存中,那么我们是不是可以访问到函数中的变量呢?答案是肯定的,这其实就是所谓的闭包,其根本原因便是js的内存模型形成语言特性.
funtion java(){
var string = "我爱用java";
funtion python(){
console.log(string);
}
return python;
}
var coder = java();
coder();
其结果便是:我爱用java
js保存了执行过程中依赖的变量,上面代码中,string变量被python()依赖,那么它将会保存下来,如果变量没有被任何函数依赖,那么他将不会被保存,而是运行被赋值.
funtion java(){
var string= 1;
funtion python(num){
var string1 = 1;
var rs = num+string;
var rs1 = num+string1;
console.log(rs+','+rs1);
}
return python;
}
var coder = java();
coder(1);
coder(1);
打印结果为:
2,2
3,2
可以发现string1 没有被依赖,那么每次都会创建新的变量赋值.
依赖解释的不够清楚,其实就是内部函数可以使用外部函数的参数数据(var变量,函数参数存放的数组),只要内部函数有执行的可能,那么外部函数的上下文不会被释放,而内部函数执行完就释放了,简单的说就是当函数依赖起上下文时,js便帮你保存当时的上下文.