函数声明
// 普通函数声明
function f(){
//
}
// 通过变量初始化
var f = function(){
//
}
// 构造函数初始化函数(请忘记它吧)
var t = new Function('x', 'y', 'alert(x+y)')
传递函数
function sum(a, b){ return a+b; }
function sub(a, b){ return a-b; }
function box(a, b, fun){ return fun(a, b); }
console.log(box(1, 2, sum))
console.log(box(1, 2, sub))
函数的属性(函数是对象)
- length:函数接受参数的个数
- prototype:函数原型
function f(a, b){ }
console.log(f.length); // 2
函数内部属性
- arguments: 对象,用来保存参数。此对象拥有一个名叫callee的属性,这属性是一个指针,指向函数本身。
- this: 指向函数所属的对象,全局函数的this是window
用法
// 阶乘
function jie1(num){ if(num <= 1) return 1; else return num * jie1(num-1); }
function jie2(num){ if(num <= 1) return 1; else return num * arguments.callee(num-1); }
console.log(jie1(5)) // 120
console.log(jie2(5)) // 120
// 如果在函数内部有着很多的自身调用,如果想改变改变函数名...
window对象(全局this)
最外围对象,所有的js对象都在其下面
// 全局变量,自动挂载到window对象上,成为其一个属性
var color = 'red';
console.log(window.color)
console.log(window); // 在控制台打印出来的window对象中可以找到color属性
//全局函数,自动挂载到window对象上
var f = function(){ //... }
// 全局this
全局的this就是window对象的指针,和使用window一样
比如:
this.color;
this.f();
console.log(this);
console.log(this === window); // true 说明this就是window
变量
变量分类
基本类型(保存在栈内存)
- Number
- Boolean
- String
引用类型(保存在堆内存)
- Object
特殊类型
- null
- undefined
变量访问
- 值访问
- 引用访问
参数传递
虽然变量分为基本类型和引用类型,但是参数的传递均是按值传递。(困惑?)
// 比较困惑的应该是传递对象吧
// 传递的参数的类型可分为:基本类型,引用
// 这里所说的均是按值传递(传递基本类型时不解释),
// 当传递引用时引用是按值传递的,也就是说函数参数
// 的那个引用和外部的引用已经没有任何联系了,在函数
// 内部改变引用不会对外部引用造成影响,但是,形参的
// 引用与外部引用指向同一个对象。java也是这样。还有
// 一点就是我感觉自己好啰嗦。
function changeName(m){ var p = {name:'Peter'}; m = p; }
changeName(man);
console.log(man.name); // Tom
类型检测
- typeof
- instanceof(当使用instanceof 检查基本类型的值时,它会返回false)
块级作用域
块级作用域? 对不起,没有
// if 语句代码块没有局部作用域
if (true) { var box = 'Lee'; }
alert(box);
// for没有局部作用域
for (var i = 0; i < 10; i ++) { var box = 'Lee'; }
alert(i);
alert(box);
var关键字
在函数内部,如果使用var,变量就是函数局部变量,否则就是全局变量