day10内容
学习目标
1.this
2.局部变量和全局变量
3.函数调用
4.函数作为参数
5.函数作为返回值
6.值传递和引用传递
1.函数
函数实际上是对象,每个函数都是Function类型的实例,具有属性和方法,函数名实际上是指向函数对象的指针。
-
表示方法:
1.函数声明
function sum(a,b){
return a+b;
}
2.函数表达式
var sum = function(a,b){
return a+b;
}
解析器在向执行环境中加载数据时,会率先读取函数声明,并使其在执行任何代码之前可用;当执行器执行到函数表达式的代码的时候才会真正的解释执行 -
函数的参数
ECMAScript函数的参数与大多数其他语言中的函数的参数有所不同,ECMAScript函数不介意传递参数的个数以及参数类型,这是因为函数的参数在函数内容是使用一个类数组对象来表示的。这个类数组对象就是arguments -
函数的调用
在JS中,函数没有重载的概念,两个函数的函数名相同即是同样一个函数,但是Java中不是
函数名(实参列表) -
作为值的函数
由于函数名本身就是变量,所以函数可以当做值来使用(参数,返回值)。
function callOther(fun,args){
return fun(args);
}
function show(msg){
alert(msg);
}
callOther(show,“哈哈”); //show为参数 -
作为返回值的函数
eg:多功能自定义排序函数
function myCompare(pro){
//函数将作为返回值返回
return function(obj1,obj2){
var val1 = obj1[pro];
var val2 = obj2[pro];
if(val1<val2){
return -1;
}else if(val1>val2){
return 1;
}else {
return 0;
}
}
}
var data = [
{
name : “aaa”,
age :12
},{
name:“ccc”,
age : 8
},{
name :“bbb”,
age : 71
}
];
console.log(data);
data.sort(myCompare(“age”));
console.log(data); -
函数内部属性
-
arguments :是类数组对象,包含着传入函数中参数,arguments对象还有一个callee的属性,用来指向拥有这个arguments对象的函数
例如:
num的阶乘,使用递归函数
function factorial(num){
if(num<=1){
return 1;
}else{
//return num * factorial(num-1);
return num * arguments.callee(num-1);
}
} -
this: 指向的是函数赖以执行的环境对象
window.color = “window”;
var person = {
color:“person”
};
function sayColor(){
alert(this.color);
}
sayColor(); //window对象调用,所以弹出 “window”
person.sayColor = sayColor; //将该方法赋给person对象
person.sayColor();//使用person对象调用该方法,弹出"window" -
-
函数的属性
length: 表示函数希望接受的命名参数的个数
function say(msg){} //say.length 1 希望接受一个参数
function add(m,n){} //add.length 2 希望接受两个参数
prototype: 保存实例方法的真正所在。在自定义引用数据类型以及继承时非常重要。 -
函数的方法
this->该函数所在的环境对象apply : 参数(在其中运行函数的作用域,参数数组(Array,arguments));
call : 参数(在其中运行函数的作用域,参数列表)
这两个方法作用都是在特定的作用域中调用函数,实际上等于设置函数内部的this的值用法一:
function sum(m,n){
return m+n;
}
function call(m,n){
//return sum.apply(this,arguments);
return sum.call(this,m,n);
}
alert(call(1,2));
用法二:
扩充函数赖以运行的作用域
window.color = “window”;
var person = {
color:“person”
};
function sayColor(){
alert(this.color);
}
sayColor.call(this);
sayColor.call(window);
sayColor.call(person);
- 基本数据类型,引用数据类型
基本数据类型的变量:
可以直接操作保存在变量中的实际的值
参数传递的时候传递的是实际值
引用数据类型的变量:
不能直接操作对象的内存空间,实际上是在操作对象的引用。
可以为引用类型变量天极爱属性和方法,也可以改变和删除其属性和方法
参数传递的时候传递的是引用地址。
值传递
值的拷贝
引用传递
引用地址的拷贝
note
作业
打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方
var count = 0;
for(var i=100;i<1000;i++){
//获取i的百位,十位,个位数
//153
var a = parseInt(i/100);
var b = parseInt(i%100/10);
var c = i%10;
//判断水仙花数
if(aaa+bbb+ccc===i){
console.log(i);
count++;
}
}
console.log(‘水仙花个数为:’,count);
ssh连接 xShell
win+R 打开运行 输入cmd进入控制台(终端)
ssh回车
ssh [email protected] 回车
js目录 mkdir day10
复习
对象
声明
构造函数声明 var obj = new Object();
对象字面量声明 var obj = {};
添加属性
修改属性
删除属性
delete 对象名.属性名
获取属性值
对象名.属性名 对象名[‘属性名’]
遍历对象
for-in
检测属性
‘name’ in obj 判断属性是否是自有属性或者继承属性
obj.hasOwnProperty(‘name’) 是否是自有属性
obj.isPropertyEnumberable(‘name’) 是否是可枚举属性
构造函数 原型对象 实例三者关系
每一个构造函数都有一个原型对象。
在构造函数内有prototype属性指向它的原型对象
在原型对象中有constructor属性指向它对应的构造函数
在原型对象中有一些属性和方法,是公用的,实例可以调用
实例是通过构造函数创建出来的对象。
var obj = new Object();
Object.prototype.constructor === Object
obj.constructor === Object
Object.prototype.isPrototypeOf(obj) true
序列化和反序列化
将JS对象转成JSON字符串
JSON.stringify(obj)
将JSON字符串转成JS对象
JSON.parse(’{“name”:“zhangsan”,“age”:12}’);
将JS对象转成字符串
obj.toString()
obj.toLocaleString()
函数
声明
函数声明 function test(){}
函数表达式声明 var fun = function(){}
函数使用/调用
test();
函数名-->函数所在的内存空间,通过函数名可以找到函数
函数声明提升,变量声明的提升
在解析器解析JS代码的时候,将函数声明提升到代码最前边/最顶部,将变量声明提升到函数声明的后边,其他代码的前边。如果变量声明中有跟函数名一样的变量,该变量声明将被忽略。
函数内部属性
arguments是一个类数组对象,内部放置实参,有length属性代表实参的个数。可以通过arguments[index]的形式访问实参。也可以使用for循环遍历arguments。
有arguments.callee属性,代表函数本身。
函数内部属性
this
函数是一个值
var a = 1;
var b = function(){}
函数作为参数
function test(){}
test(a);
test(b);
函数作为返回值
function test(){
//return a;
return b;
}
基本数据类型之间变量传递–>值传递
var a = 1;
var b = a; 值传递 复制a的值1赋值给b
a = 2;
console.log(a); //2
console.log(b); //1
引用数据类型之间变量传递–>址传递–>引用传递
var obj = {name:‘zhangsan’};
var obj2 = obj; //址传递,将obj的内存地址复制一份给obj2
obj.name = ‘lisi’;
console.log(obj,obj2); //{name:‘lisi’} {name:‘lisi’}