1.创建函数有哪些方法?分别有什么特点?
①使用 "函数声明" 创建函数
函数声明具有函数声明提升的特点,将函数声明提升到作用域顶端,意思是在执行代码之前会先读取函数声明,也就是说可以把函数声明放在函数调用的后面。
语法:
* function 函数名([形参1,形参2...形参N]){
* 语句...
* }
②使用 "函数表达式" 来创建一个函数
var 函数名 = function([形参1,形参2...形参N]){
* 语句....
* }
可分为命名函数表达式与匿名函数表达式两种
// 1.命名函数表达式
var testA=function abc(){
console.log(aaa);
}
// 2.匿名函数表达式 --最常用简称函数表达式
var testB=function(){
console.log(bbb);
}
函数表达式与函数声明最明显的区别是它不具有变量提升属性,如使用函数声明时,将函数调用放在前面:
test();//弹出hello,因为函数声明提升,函数调用之前,已经读取了该函数完成了声明
function test(){
alert("hello");
}
而如果在函数变量式中:
test();//报错:Uncaught ReferenceError: test is not defined
//在函数调用时,作用域中还未读取该函数的定义
//作用域读取函数表达式是按照代码顺序读取
var test = function(){
alert("hello");
}
test();//弹出hello
③使用 "构造函数"
构造函数的执行流程:
-
1.立刻创建一个新的对象
-
2.将新建的对象设置为函数中this,在构造函数中可以使用this来引用新建的对象
-
3.逐行执行函数中的代码
-
4.将新建的对象作为返回值返回
var 对象名{
属性名 1:属性值;
属性名 2:属性值;
....
函数名 1:function(形参...)
{函数体 1},
函数名 2:function(形参...)
{函数体 2},
.....
}
举例:
var zjl = {
name:"周杰伦”,
gender:"male",
setAge:function(age){
this curage=age;
}
};
this关键字代表zjl这个对象,this.curage就是把形参的值赋给zjl这个对象的courage属性,如果用同样的方法给属性name和gender赋值,赋值后name和gender的初始值就会被覆盖。如果不加this,curage就不是对象zjl的属性了,而是一个全局变量,如果是var courage,那它就是setAge里的局部变量,不再是zjl的属性了,加了this关键字的方法和属性叫做公有方法和属性。
2.见如下代码,b会打印出什么?
(function() {
var a = b = 5;
})();
console.log(b);
b为5
详细分析:
(function() {
var a = b = 5;
console.log(typeof a);//number
console.log(typeof b);//number
})();
console.log(typeof a);//undefined
console.log(typeof b);//number
var a = b =5
其实等价于var a = b
与b=5
同理,如果等式更长,如var a=b=c=d=5
,它等价于var a=(b=(c=(d=5)))
;因为赋值是从右向左结合,其中只有a被声明了,b,c和d可以看作都是自动解析为全局变量。
3.编写一个函数,实现一个输出 n (n > 0,否则返回原字符串)遍连接后的 str 功能,如下:
var a = repeatStr('hello', 2); //hellohello
var a = repeatStr('hello', 4); //hellohellohellohello
思路,将字符串看作join的连接符,给一个空数组添加个数为重复次数加一的连接符
实现如下:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>repeatStr</title>
<script type="text/javascript">
function repeatStr(str, num) {
document.write(new Array(num + 1).join(str) + '<br>');
}
var a = repeatStr('hello', 2);
var a = repeatStr('hello', 4);
</script>
</head>
<body>
</body>
</html>
4.以下代码的执行结果是:
function test() {
console.log(a);//undefined
console.log(foo());//2
var a = 1;
function foo() {
return 2;
}
}
test();
5.以下代码的执行结果分别是:
function foo(){
return 1;
}
var foo;
console.log(typeof foo);//function
function foo(){
return 1;
}
var foo = 1;
console.log(typeof foo);//number
6.编写一个函数,实现一个乘法计算器:无论输入多少个数字参数,最终都返回参数的乘积。例如:
var a = multiplicationCalculator(3, 6); // 18
var b = multiplicationCalculator(3, 6, 2); // 36
var c = multiplicationCalculator(1, 2, 5, 6); // 60
.........
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>multiplicationCalculator</title>
<script type="text/javascript">
function multiplicationCalculator() {
var num = 1;
for (i = 0; i < arguments.length; i++) {
num *= arguments[i];
}
document.write(num + "<br>");
}
multiplicationCalculator(3, 6);
multiplicationCalculator(3, 6, 2);
multiplicationCalculator(1, 2, 5, 6);
</script>
</head>
<body>
</body>
</html>
7.编写一个函数,实现如下语法的功能:var a = add(2)(3)(4); // 9,提示:2 + 3 + 4 = 9
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>repeatStr</title>
<script type="text/javascript">
function add(a) {
var num = 0;
num += a;
return function add(b) {
num += b;
return function add(c) {
num += c;
document.write(num);
}
}
}
add(2)(3)(4);
</script>
</head>
<body>
</body>
</html>
网友评论