引言
总所周知,JavaScript是一个很随便的语言,因此,在学习它的语法的时候,我是和Java语法对比着学的,可能会有些绕
函数
方法:对象(属性,方法)
函数:放在对象外面的方法
定义函数
定义方式一
绝对值函数
function abs(x){
if(x>=0){
return x;
}else{
return -x;
}
}
一旦执行到return代表函数结束,返回结果!
如果没有执行return,函数执行完也会返回结果,结果就是undefined(未定义)
定义方式二
var abs = function(x){
if(x>=0){
return x;
}else{
return -x;
}
}//类似于匿名内部类
function(x){...} 这是一个匿名函数,但是可以把结果赋值给abs,通过abs就可以调用函数!
方法一和方法二等效
调用函数
abs(10)
参数问题:JavaScript 可以传任意个参数,也可以不传递参数
参数传进来是否存在的问题?假设不存在参数,如何规避
var abs = function(x){
//手动抛出异常
if (typeof x !=="number"){
throw new Error("abs()参数类型错误");
}
if(x>=0){
return x;
}else{
return -x;
}
}
arguments
arguments是一个JS免费赠送的关键字 代表传递进来的所有参数为数组
作用:利用arguments可以拿到所有的参数,比如:如果函数中只有一个参数,如果传入第二个参数,我们可以通过arguments来拿到第二个参数进行使用
var abs = function(x){
console.log("x=>"+x);
for (var i=0;i<arguments.length;i++){
console.log(arguments[i]);
}
if(arguments.length === 2){
//另外的方法
}else if(arguments.length === 3){
}
if(x>=0){
return x;
}else{
return -x;
}
}
问题:arguments包含所有的参数,我们有时候想要使用多余的参数来进行附加操作时,需要排除已有的参数,且已有参数也不固定
rest
以前:
if(arguments.length > 2){
for(var i = 2; i < arguments.length; i++){
//...
}
}
ES6引入的新特性,获取除了已经定义的参数之外的所有参数...
function aaa(a,b,...rest){
console.log("a=>"+a);
console.log("b=>"+b);
console.log(rest);
}
rest参数只能写在最后面,必须用...标识。
变量的作用域
Java(局部变量,全局变量。类变量)
在JavaScript中,var定义变量实际是有作用域的
假设在函数体中声明,则在函数体外不可以使用 (想实现的话,后面研究闭包)
function lyc(){
var x = 1;
x = x + 1;
}
x = x + 2;// Uncaught ReferenceError: x is not define
如果两个函数使用了相同的变量名只要在函数内部,就不冲突
'use strict'
function lyc(){
var x = 1;
x = x + 1;
}
function lyc1() {
var x = "A";
x = x + 1;
}
内部函数可以访问外部函数的成员,反之则不行
function lyc(){
var x = 1;
//内部函数可以访问外部函数的成员,反之则不行
function lyc1() {
var y = x + 1;//2
}
var z = y + 1;//Uncaught ReferenceError: y is not defined
}
假设内部函数变量和外部函数变量重名
function lyc1() {
var x = 'A';
console.log('inner'+x)
}
console.log('outer'+x)
lyc1();
}
假设在JavaScript中函数查找变量从自身函数开始~,由内向外查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量
提升变量的作用域
function lyc(){
var x = 'x' + y;
console.log(x);
var y = 'y';
}
结果: x undefined
说明JavaScript的执行引擎,自动提升了y的声明,但是不会提升变量y的赋值
function lyc2(){//习惯写法,将所有的变量写在最前面
var y;
var x = 'x' + y;
console.log(x);
y = 'y';
}
这个是在JavaScript建立之初就存在的特性,养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护
function lyc2(){
var x = 1,
y = x + 1,
z,i,a;
//之后随便用
}
全局函数
var x = 1;
function f(){
console.log(x)
}
f();
console.log(x);
全局对象 window
var x = 'xxx'
window.alert(x);
alert(window.x);
alert() 这个函数本身也是一个window变量
var x ='xxx';
window.alert(x);
var old_alert = window.alert;
window.alert = function(){
};
//发现alert()失效了
window.alert(123);
//恢复
window.alert = old_alert;
window.alert(456);
JavaScript实际上只有一个全局作用域,任何变量(函数也可以被视为变量),假设没有在函数作用范围找到,就会向外查找,如果在全局作用域都没有找到,则报错ReferenceError
规范 :由于我们所有的全局变量绑定到Window上,如果不同的JS文件使用相同的全局变量,就会冲突->如何减少冲突
//唯一全局变量
var lyc = {};
//定义全局变量
lyc.name = 'lyc';
lyc.add = function (a,b){
return a+b;
}
把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突
局部作用域 let
function aaa(){
for(var i = 0; i < 100; i++){
console.log(i)
}
console.log(i+1)//问题:i出了这个作用域还在使用
}
ES6 let关键字,解决局部作用域冲突问题
function aaa(){
for(let i = 0; i < 100; i++){
console.log(i)
}
console.log(i+1)//问题:i出了这个作用域还在使用
}
建议大家使用let
去定义局部作用域的变量
常量 const
在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量,建议不要修改这样的值
在ES6引入了常量关键字const
const PI = '3.14';//只读变量
console.log(PI);
PI = '123'; //TypeError:Assignment to constant varible
console.log(PI)
方法
方法就是把函数放在对象的内部,对象只有两个东西:属性,方法
var lyc = {
name:'lyc',
birth:1995,
age:function (){
var now = new Date().getFullYear();
return now-this.birth;
},
sex:'男',
height:1.70,
weight:60,
say:function () {
console.log(this.name+"说:我叫"+this.name+",今年"+lyc.age()+"岁,身高"+this.height+"米,体重"+this.weight+"kg,性别"+this.sex)
}
}
this.代表什么?代表调用这个方法或属性的对象
function getAge(){
var now = new Date().getFullYear();
return now-this.birth;
}
var lyc = {
name:'lyc',
birth:1995,
age:getAge,
sex:'男',
height:1.70,
weight:60,
say:function () {
console.log(this.name+"说:我叫"+this.name+",今年"+lyc.age()+"岁,身高"+this.height+"米,体重"+this.weight+"kg,性别"+this.sex)
}
}
//lyc.age() 30
//getAge() NaN 调用getAge()的是window对象,
this是无法指向的,是默认指向调用它的那个对象
apply
在JS中可以控制this指向
function getAge(){
var now = new Date().getFullYear();
return now-this.birth;
}
var lyc = {
name:'lyc',
birth:1995,
age:getAge,
sex:'男',
height:1.70,
weight:60,
say:function () {
console.log(this.name+"说:我叫"+this.name+",今年"+lyc.age()+"岁,身高"+this.height+"米,体重"+this.weight+"kg,性别"+this.sex)
}
};
getAge.apply(lyc)//this,指向了lyc,参数为空
以上就是JavaScript函数中的主要用法,希望对大家有帮助!