javasrcipt 内存模型

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的写法

  1. funtion log (pargma){
    console.log(pargma);
    }

  2. 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便帮你保存当时的上下文.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值