1.1 定义函数
定义方式一
绝对值函数
function test(x){
if(x>=0){
return x;
}else{
return -x;
}
}
//一旦执行到return代表函数结束,返回结果
//如果没有执行return,函数执行完也会返回结果undefined
定义方式二
var test = funxtion(x){ //匿名函数,可以把结果赋值给test,通过test调用函数
if(x>=0){
return x;
}else{
return -x;
}
}
调用函数
test(10); //10
test(-10); //10
参数问题:Javascript可以传任意个参数,也可以不传参数
假设不存在参数,如何规避?
var test = function (x) {
//手动抛出异常来进行判断
if(typeof x!== 'number'){
throw 'Not a number';
}
if (x>=0){
return x;
}else {
return -x;
}
}
arguments
代表传递进来的所有参数是一个数组
var test = function (x) {
console.log("x:"+x);
for (var i = 0; i<arguments.length; i++){
console.log(arguments[i]);
}
if (x>=0){
return x;
}else {
return -x;
}
}
arguments存在的问题:当需要使用多余的参数来进行附加操作时,需要排除已有的参数
rest
ES6之前的用法
if(arguments.length>2){}
for (var i = 2; i<arguments.length; i++){
......
}
}
ES6引入的新特性,获取除了已定义的参数之外的所有参数
function test(a,b,...rest) {
console.log("a:"+a);
console.log("b:"+b);
console.log(rest);
}
rest只能写在最后面,必须用 ...rest 标识
1.2 变量的作用域
function test() {
var x = 1;
x = x + 1;
}
x = x + 2;
//Uncaught ReferenceError: x is not defined
变量x在函数体中声明,在函数体外不可以使用
如果两个函数使用的相同的变量名,只要在函数内部,就不冲突
内部函数可以使用外部函数的成员,反之不行
function test() {
var x = 1;
function test1() {
var y = x + 1; //2
}
var z = y + 1; //Uncaught ReferenceError: x is not defined
}
假设内部函数变量和外部函数变量重名
function t() {
var x = 1;
function t1() {
var x = '大写的一';
console.log('inner:'+x); //inner:大写的一
}
console.log('outer:'+x); //outer:1
t1();
}
t();
注:函数查找变量从自身函数开始,由”内“向”外“查找,如果外部存在同名的函数变量,则内部函数会屏蔽外部函数的变量
提升变量的作用域
function t(){
var x = "abc" + y;
console.log(x);
var y = 'y';
}
结果会报错:x undefined
js执行引擎自动提升了y的声明,但是没有提升变量y的赋值
function t(){
var y;
var x = "abc" + y;
console.log(x);
y = 'y';
}
注:所有的变量定义都放在函数的头部,便于代码维护
全局函数
//全局变量
var x = 1;
function t(){
console.log(x); //1
}
t();
console.log(x); //1
全局对象window
var x = 123;
alert(x);
alert(window.x); //默认所有的全局变量,都会自动绑定在winsow对象下
alert() 这个函数本身也是一个window
变量
var x = '123';
window.alert(x);
var old_alert = window.alert;
window.alert = function (){
}
window.alert(123); //失效
//恢复
window.alert = old_alert;
window.alert(456);
JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),如果没有在函数作用范围内找到,就会向外查找,如果在全局作用域中也没有找到,会报错ReferenceError
。
规范
//唯一全局变量
var test = {};
//定义全局变量
test.name = '孙笑川';
test.add = function (a,b) {
return a + b;
}
把自己的代码全部放入自己定义的唯一空间空间名字中,降低全局命名冲突的问题
局部作用域 let
function t() {
for (var i = 0; i < 100; i++){
console.log(i);
}
console.log(i); //101
}
ES6引入let关键字,解决局部作用域冲突问题
function t() {
for (let i = 0; i < 100; i++){
console.log(i);
}
console.log(i); //Uncaught ReferenceError: i is not defined
}
常量 const
在ES6之前,全部用大写字母命名的变量就是常量
var PI = '3.14';
console.log(PI); //3.14
PI = 'abc';
console.log(PI); //abc,值改变
在ES6中引入关键字const
const PI = '3.14';
console.log(PI);
PI = 'abc'; //TypeError: Assignment to constant variable
console.log(PI);
1.3 方法
定义方法
//将函数放在对象中
var test = {
name: 'sun',
birth: 1988,
//方法
age: function () {
var time = new Date().getFullYear();
return time-this.birth;
}
}
//属性
test.name
//调用方法
test.age()
this代表什么?
function getAge() {
var time = new Date().getFullYear();
return time-this.birth;
}
var test = {
name: 'sun',
birth: 1988,
age: getAge
}
test.age() //2020-1988
getAge() //NaN
this是无法指向的,默认指向调用它的对象
apply
在js中控制this的指向
function getAge() {
var time = new Date().getFullYear();
return time-this.birth;
}
var test = {
name: 'sun',
birth: 1988,
age: getAge
}
getAge.apply(test,[]); //this指向了test,参数为空
评论 (0)