JavaScript的进阶之路(二)函数简介,变量、作用域和内存问题
<h3>ECMAScript中函数不存在函数签名的概念,没有重载</h3>
<h3>无需指定返回值,可以在任何时候返回任何值。未指定返回值的函数,返回的是一个特殊的undefined值</h3>
<script type="text/javascript">
function sayHi(){
console.log("Hi");
};
sayHi();
function sayName(name,age){
console.log("我是"+name+",我今年"+age+"岁了!");
};
sayName("吴琼",);
function sum(num1,num2){
return num1+num2;
alert("我不会被执行到!"); //位于return语句之后的任何代码都不会执行。
}
sum(,);
function compare(n1,n2){
if(n1<n2){
console.log(n1+"小于"+n2);
}else if(n2<n1){
console.log(n2+"小于"+n1);
}else{
console.log("他们俩相等!");
}
}
compare(,);
</script>
<h1>基本类型和引用类型的值</h1>
<h3>在操作对象时,实际上是在操作对象的引用,而不是实际的对象。</h3>
<h3 class="red">基本类型具有动态的值,引用类型具有动态的属性。</h3>
<h3 class="red">复制变量值:基础类型是复制一个新值;引用类型是复制一个指针。</h3>
<h3 class="red">传递参数:可以把函数的参数当成一个局部变量。基本类型传递参数是复制值给一个局部变量,引用类型传递参数是复制一个地址给变量对象;</h3>
<h2 class="red">之前说到函数的参数是按值传递的,那么复制的这个地址可以当做一个值吗?答案:可以。为什么?</h2>
<h3>检测变量:typeof 操作符可以确定一个变量是字符串、数值、布尔值,还是undefined的最佳工具。检测对象时,用instanceof操作符。</h3>
<h1>执行环境(也称作用域)</h1>
<h3>每个环境都有一个与之关联的变量对象。执行环境有2种:全局和局部(函数)。</h3>
<h3 class="red">作用域链的作用:保证 (对执行环境有权访问的 )(所有变量和函数的) 有序访问;</h3>
<h3>作用域链的前端始终都是所在环境的与之关联的变量对象。在Web浏览器中,window对象始终是最顶端。</h3>
<h3>函数的参数也被当成变量来对待,访问规则与执行环境中的其他变量相同。</h3>
<h2>延长作用域链</h2>
<h3>try{}catch(e){}语句的catch块 和 with语句可以延长作用域链。</h3>
<h2>没有块级作用域:像if语句中声明的变量和for语句中声明的循环变量,在外部均可以访问到;</h2>
<h3>在函数中的变量如果想在外部访问,必须是全局变量(没有var声明的变量)。</h3>
<h3>在函数中的变量查找规则是从内环境到外环境。</h3>
<h1>垃圾收集:找出那些不在继续使用的变量,然后释放其占用的内存。常见的2个策略:标记清除和引用计数。</h1>
<h3>关于垃圾收集产生的性能问题:IE6默认值,IE7根据内存用量动态的修改值,性能比IE6大大提高。</h3>
<h3>关于管理内存:JavaScript分配给Web浏览器的可用内存量比分配给桌面应用程序的要少。</h3>
<h2 class="red">内存限制会影响网页的性能:1、给变量分配的内存 2、调用栈以及在一个线程中同时执行的语句数量。</h2>
<h2 class="red">确保占用最少的内存可以让页面获得更好的性能。而优化内存占用的最佳方式就是为执行中的代码只保存必要的数据。</h2>
<h2 class="red">解除引用:将用不到的全局变量设置为null来释放其引用。此时,并没有释放内存,只是让值脱离了执行环境,下次垃圾回收时再释放。</h2>
<script type="text/javascript">
var a=;
var b=a;
delete a;
console.log(b); //a对b没有任何影响
var obj1=new Object();
var obj3=new Object();
var obj2=obj1;
obj1.name="吴琼";
console.log(obj2.name);
obj2.name="张虹";
console.log(obj1.name);
console.log(obj3.name);
var num = ;
function add(sum){
sum+=;
console.log(sum);
};
add(num); // 基本类型传递参数是把变量num的值复制给一个局部变量sum;
console.log(num); //变量的值并没有改变
function odd(obj){
obj.name="吴琼";
}
var person = new Object();
odd(person);
console.log(person.name); function odd2(obj){
obj.name="吴琼";
var obj = new Object(); //在函数内的变量引用的是一个局部对象,在函数执行完毕后会立即被销毁;
obj.name="张虹";
};
var person2=new Object();
odd(person2); //把person2传递给odd2()方法后,其name属性的值被定义为“吴琼”,如果是按引用传递的,则obj的name会被修改;
console.log(person2.name);
console.log(odd instanceof Function);
//测试没有块级作用域
if(true){
var color = "red";
}
console.log(color); // red//测试没有块级作用域
for(var i=;i<;i++){
//
};
console.log(i); //10 //测试没有块级作用域
//函数中的变量在外部访问
var sum;
function fn(num1,num2){
sum = num1+num2;
};
fn(,);
console.log(sum); //如果函数内声明var sum 则报错sum is not defind
//作用域链的查询
var col = "black";
function getCol(){
var col = "blue"; //从内到外查找 如果有这个声明,则 blue
return col;
}
console.log(getCol()); //blue
getCol(); //执行方法后,函数内用var 声明的变量依然为局部变量
console.log(col);//black
</script>
JavaScript的进阶之路(二)函数简介,变量、作用域和内存问题的更多相关文章
- Scala进阶之路-Scala函数篇详解
Scala进阶之路-Scala函数篇详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传值调用和传名调用 /* @author :yinzhengjie Blog:http: ...
- 第一百零六节,JavaScript变量作用域及内存
JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...
- JavaScript的进阶之路(六)理解函数
函数:定义一次,多次调用:用于对象的属性则称为对象的方法:在JavaScript中,函数即对象:嵌套的函数形成闭包: 定义函数和简单调用函数: //函数定义 function f1(){ //没有参数 ...
- javascript 红宝书笔记之函数、变量、参数、作用域
ECMAScript 不介意传进来多少个参数,也不介意传进来的参数类型. 理解参数: 命名的参数只提供便利,不是必需的. ECMAScript 的变量包含两种不同的数据类型的 ...
- JavaScript变量作用域和内存问题(二)
执行环境是js中特别重要的概念,是指变量或者函数可以访问其他数据,定义自己的行为.每个执行环境都有一个与之相对应的变量对象,执行环境中定义的所有变量和函数都保存在这个变量中,我们看不到这个变量,但是后 ...
- python 函数及变量作用域及装饰器decorator @详解
一.函数及变量的作用 在python程序中,函数都会创建一个新的作用域,又称为命名空间,当函数遇到变量时,Python就会到该函数的命名空间来寻找变量,因为Python一切都是对象,而在命名空间中 ...
- Python 包、模块、函数、变量作用域
Python 项目的组织结构 - 包 -- 模块 --- 类 ---- 函数.变量 Python是利用包和模块来组织一个项目的. 包: 包的物理表现是一个文件夹,但是一个文件夹却不一定是个包, ...
- python学习笔记三:函数及变量作用域
一.定义 def functionName([arg1,arg2,...]): code 二.示例 #!/usr/bin/python #coding:utf8 #coding=utf8 #encod ...
- Python(五) 包、模块、函数与变量作用域
一.while循环与使用场景 CONDITION=1 while CONDITION <=5 : CONDITION +=1 print("hello") else: pri ...
随机推荐
- 箭头函数中的this和普通函数中的this对比
ES6中新增了箭头函数这种语法,箭头函数以其简洁性和方便获取this的特性.下面来总结一下他们之间的区别: 普通函数下的this: 在普通函数中的this总是代表它的直接调用者,在默认情况下,this ...
- 读《3M 利率分析新框架》
目录 读<3M 利率分析新框架> 前言 传统的利率研究框架 3M 利率研究新框架 Macro Monetary Macro Prudence 总结 参考文献 <3M 利率分析新框架& ...
- 爬虫防封IP
当抓取数据逐渐增大时,服务器的负荷会加大,会直接封掉来访IP: 采取措施: 1.创建请求头部信息: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT ...
- [短期持续更新]Codeforces 构造题一览
说实话我觉得做这种题很没意思(不够硬核), 可是人有短板终究是要补的...起码这种类型补起来相对简单 所以还是把先前准备好的专题放下吧,做点实现上比较休闲的题 ps.为了精简篇幅,代码全部丢到ubun ...
- PHP 数字金额转换成中文大写金额的函数 数字转中文
/** *数字金额转换成中文大写金额的函数 *String Int $num 要转换的小写数字或小写字符串 *return 大写字母 *小数位为两位 **/ function num_to_rmb($ ...
- Mike
- c#中的引用类型和值类型
一,c#中的值类型和引用类型 众所周知在c#中有两种基本类型,它们分别是值类型和引用类型:而每种类型都可以细分为如下类型: 什么是值类型和引用类型 什么是值类型: 进一步研究文档,你会发现所有的结构都 ...
- Celery ValueError: not enough values to unpack (expected 3, got 0)的解决方案
Celery ValueError: not enough values to unpack (expected 3, got 0)的解决方案 背景 最近因项目需要,学习任务队列Celery的用法,跟 ...
- 生成随机32位Token43位asekey
// 生成随机32位Token字符和43位AseKey var arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', ' ...
- Verilog三段式状态机描述
时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息. 状态机采用VerilogHDL语言编码,建议分为三个always段完成. 三段式建模 ...