函数
方法:对象(属性,方法)
函数:
4.1定义函数
定义方式一
绝对值函数
function abs(x) {
if (x>=0){
return x;
} else{
return -x
}
}
一旦执行return代表函数结束,返回结果!
如果没有执行return,函数执行完也会返回结果,结果就是undefined
定义方式二
let abs = function(x){
if (x>=0){
return x;
} else{
return -x
}
}
function(x){...}这是一个匿名函数,但是可以把结果赋值给abs,通过abs就可以调用函数!
方式一和方式二是一样的
调用函数
abs(10) //10
abs(-10) //10
参数问题:JavaScript可以传任意一个参数,也可以不传参数
参数进来是否存在的问题?假设不存在参数如何规避? 可以手动抛出异常
let abs = function(x){
//手动抛出异常来判断
if (typeof x!==‘number‘){
throw ‘Not a Number‘;
}
if (x>=0){
return x;
} else{
return -x
}
}
arguments
arguments是一个JS免费赠送的关键字
代表,传递进来的所有的参数,是一个数组!
let abs = function(x){
console.log("x=>" +x);
for (let i = 0; i<arguments.length;i++){
console.log(arguments[i]);
}
if (arguments.length>1){
arguments[1];
}
if (x>=0){
return x;
} else{
return -x
}
}
arguments包含所有的参数,我们有时候想使用多余的参数来里德附加操作,需要排除已有参数
rest
//以前的
function bbb(a,b) {
console.log("a=>" + a);
console.log("a=>" + b);
if (arguments.length > 2) {
for (let i = 2; i < arguments.length; i++) {
//....
}
}
}
rest参数只能写在最后面,必须用...标识。
ES6引入的新特性,获取除了已经定义的参数之外的所有参数
4.2变量的作用域
在javascript中,var定义变量实际是有作用域的。
假设在函数体中声明,则在函数体外不可以使用 (非要想实现的话,后面用闭包)
function qj() {
let x = 1;
x = x + 1;
}
x = x + 2; //Uncaught ReferenceError: x is not defined
如果两个函数使用了相同的变量名,只要在函数内部,就不冲突
内部函数可以访问外部函数的成员,反之则不行
假设,内部函数变量和外部函数的变量,重名!
//‘use strict‘;
function qj() {
let x = 1;
function qj2() {
let x = "A";
console.log(‘inner‘+x); //outer1
}
console.log(‘outer‘+x); //innerA
qj2();
}
qj()
假设在JavaScript中函数查找变量从自身函数开始~,由”内“向”外“查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数变量。
提升变量的作用域
function qj() {
let x = ‘x‘ + y;
console.log(x);
let y = ‘y‘;
}
结果:xundefined
说明:js执行引擎,自动提升了y的声明,但是不会提升就是y的赋值
function qj2() {
let y;
let x = ‘x‘ + y;
console.log(x);
y = ‘y‘;
}
这个是在JavaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护
function qj2() {
let x = 1,
y = x + 1,
z,i; //undefined
//之后随意用
}
全局函数
‘use strict‘;
//全局变量
let x = 1;
function f() {
console.log(x)
}
f()
console.log(x)
全局对象window
let x = "xxx";
alert(x);
alert(window.x); //默认所有的全局变量,都会自动绑定在window对象下;
alert()这个函数本身也是一个"window"变量;
‘use strict‘;
let x = "xxx";
window.alert(x);
let old_alert= window.alert;
//old_alert(x)
window.alert = function () {
};
//发现alert()失效了
window.alert(123);
//恢复
window.alert = old_alert();
window.alert(456);
JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错RefrenceError
规范
由于我们所有的全局变量都会绑定到我们的window上。如果不同的js文件,使用了相同的全局变量,就会冲突~如何能够减少冲突?
//唯一全局变量
let xiao = {};
//定义全局变量
xiao.name = ‘xiao‘;
xiao.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);
}
建议都是用let去定义局部作用域的变量;
常量 const
在ES6之前 ,怎么定义常量:只有用全部大写字母命名的变量就是常量;建议不要修改这样的值
let PI = ‘3.14‘;
console.log(PI);
PI = ‘321‘; //可以改变这个值
console.log(PI);
在ES6引入了常量关键字const
const PI = ‘3.14‘;//只读变量
console.log(PI);
4.3, 方法
定义方法
方法就是把函数放在对象的里面,对象只有两个东西:属性和方法
let xiao = {
name: ‘李‘,
bitrh: 2020,
//方法
age: function () {
//今年-出生的年
let now = new Date().getFullYear();
return now-this.bitrh;
}
}
//属性
xiao.name
//方法,一定要带()
xiao.age()
this,代表什么意思,拆开上面的代码
function getAge () {
//今年-出生的年
var now = new Date().getFullYear();
return now-this.bitrh;
}
var xiao ={
name: ‘李‘,
bitrh: 2020,
age:getAge
}
this是无法指向的,是默认指向调用它的那个对象;
apply
在js中可以控制this指向
function getAge () {
//今年-出生的年
var now = new Date().getFullYear();
return now-this.bitrh;
}
var xiao ={
name: ‘李‘,
bitrh: 2000,
age:getAge
};
getAge.apply(xiao,[]); //this,指向了xiao,参数为空
转载https://www.cnblogs.com/a546558309/p/9614436.html