JavaScript基础一
1,函数
1.1 函数定义
所谓函数,本质上是一种代码的分组形式。我们可以通过这种形式赋予某组代码一个名字,便于日后重用时调用。一般来说,函数声明通常由以下几个部分组成:
· function子句
· 函数名称
· 函数所需的参数,参数之间用逗号分隔
· 函数所要执行的代码块,函数体
· return子句。函数通常都会有返回值,如果某个函数没有显式的返回值,默认它的返回值是undefined
· 一个函数只能有一个返回值。当需要同时返回多个值,可以考虑将其放入一个数组中,以数组形式返回
1.2 参数(形参与实参)
· 形参:出现在函数定义文法中的参数列表是函数的形式参数
· 实参:函数调用时实际传入的参数是函数的实际参数
一般情况下,形参与实参的个数是相同。但在JavaScript中并不强求这一点,在特殊情况下,函数的形参和实参的个数可以不同。这种情况下使用Argument对象。
1.3 JavaScript定义函数的三种方式
·普通方式
语法: function 函数名(参数){函数体}
例: function add(a,b){
return a+b;
}
alert(add(3,4));
·构造函数方式
语法:var 变量名 = new Function(参数,函数体);
例: var add = new Function (‘a’,'b’,'return a+b;’);
alert (add(2,4));
·直接定义函数
语法: var 变量名 = function(参数){函数体}
例: var result = function(a,b){return a+b;}
alert(result(1,2));
2,JavaScript事件
3,JavaScript提高--面向对象
3.1函数
· Arguments对象
在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问。
-检测参数个数
function howManyArgs() {
alert(arguments.length);
}
howManyArgs("string", 45);
howManyArgs();
howManyArgs(12);
-模拟函数重载
function doAdd() {
if(arguments.length == 1) {
alert(arguments[0] + 5);
} else if(arguments.length == 2) {
alert(arguments[0] + arguments[1]);
}
}
doAdd(10); //输出 "15"
doAdd(40, 20); //输出 "60"
· 变量的作用域
- 全局变量与局部变量
var global = 1;
function f(){
var local = 2;
global++;
return "global = "+global;
}
alert(f()); //output global = 2
alert(f()); //output global = 3
alert(local); //output local is undefined
-声明局部变量(没有使用局部变量)
function f(){
local = 2;
}
alert(local); //output local is undefined
f();
alert(local); //output global = 2
· 在函数f()中定义了一个变量local。在函数没有被调用之前,该值不存在
· local变量会在f()函数首次被调用的创建,并赋予全局作用域
-函数域与全局域
var a = 123;
function f(){
alert(a); //output undefined
var a = 1;
alert(a); //output 1
}
f();
· 函数域始终优先于全局域,所以局部变量a会覆盖同名的全局变量(就近原则)
3.2函数也是数据
-匿名函数
JavaScript可以将函数作为数据函数使用。作为函数本体,它像普通的数据一样,不一定要有名字。默认名字的函数被称之为“匿名函数”。例如:
function (a){return a;}
匿名函数的两种用法
· 可以将匿名函数作为参数传递给其他函数。这样,接收方函数就能利用所传递的函数。
· 可以定义某个匿名函数来执行某些一次性任务
-回调函数
function add(a, b){
return a() + b();
}
var one = function(){return 1;}
var two = function(){return 2;}
alert(add(one,two)); //output 3
//可以直接使用匿名函数来替代one()和two(),以作为目标函数的参数
alert(add(function(){return 1;}, function(){return 2;}));
在这个例子中,函数one和two都是回调函数。
当将函数A传递给函数B,并由B来执行A时,A就成了一个回调函数(callback function)。如果A还是一个无名函数,就称之为匿名回调函数。
回调函数的优点:
· 它可以在不做命名的情况下传递函数(这意味着可以节省全局变量)。
· 可以将一个函数调用操作委托给另一个函数(这意味着可以节省一些代码编写工作)
· 回调函数也有助于提升性能
//回调示例
//该函数通过一个循环将其所接收的三个参数分别乘以2,并以数组的形式返回结果
function two(a, b, c){
var i, arr = [];
for(i = 0;i < 3; i++){
arr[i] = arguments[i] * 2;
}
return arr;
}
//将接收的参数加一后返回
function addone(a){
return a + 1;
}
//测试上面的两个函数
alert(two(1, 2, 3)); //output [2, 4, 6]
alert(addone(100)); //output 101
//将三个数据在两个函数之间传递
var myarr = [];
myarr = two(10, 20, 30);
for(var i = 0; i < 3; i++){
myarr[i] = addone(myarr[i]);
}
alert(myarr); //output [21, 41, 61]
/*
* 以上代码可以工作,但是显然不够优化。
* 这里使用了两次循环。如果处理的数据量很大火循环操作很复杂的话,开销一定不小。
*/
//优化之后的代码(修改two函数)
function two(a, b, c, callback){
var i, arr = [];
for(i = 0;i < 3; i++){
arr[i] = callback(arguments[i] * 2);
}
return arr;
}
myarr = two(1, 2, 3, addone);
alert(myarr); //output [3, 5, 7]
//还可以使用匿名函数来替代addone函数
myarr = two(1, 2, 3, function addone(a){return a + 1;});
-自调函数
自调函数--其实就是在定义函数后自行调用。例如
(
function(){
alert("javascript");
}
)()
· 第一对括号,放置的是一个匿名函数。
· 第二对括号的作用,是立即调用
· 自调函数只需:将匿名函数的定义放进一对括号中,然后外面再跟一对括号即可。
(
function(name){
alert("Hello " + name + "!");
}
)("javascript")
//output Hello javascript!
· 第一个括号中的匿名函数接受一个参数
· 第二个括号,在调用时,向匿名函数传递参数内容
—内部(私有)函数
function a(param){
function b(input){
return input * 2;
};
return "The result is " + b(param);
}
alert(a(2)); //The result is 4
·当调用全局函数a()时,本地函数b()也会在其内部被调用。由于b()是本地函数,它在a()以外的地方是不可见的,所以将b称之为私有函数。
· 私有函数的优点:
-有助于确保全局名字空间的纯净行(命名冲突的机会很小)
-私有性 — — 只将一些必要的函数暴露给“外面”,并保留属于自己的函数,使他们不为该应用程序的其他部分所用。