函数及面向对象
函数
定义函数
java的:
public 返回值类型 方法名(){
return 返回值
}
定义方式一
绝对函数:
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) //10
abs(-10) //10
参数问题:javaScript 可以传任意个参数,也可以不传参数
参数进来是否存在
arguments
arguments是一个免费赠送的js,拿来即用,代表传递进来的所有参数,是一个数组!
var abs = function(x){
console.log("x=>"+x);
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
if(x>=0){
return x;
}else{
return -x;
}
}
提升变量作用域
function jq(){
var x = "x" + y;
console.log(x);
var y = 'y';
}
结果:xundefined
说明:js执行引擎,自动提升了y的声明,但是不会提示变量y赋值
function jq2(){
var y;
var x = "x" + y;
console.log(x);
y = 'y';
}
这个是在javaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护;
function jq2(){
var y = x + 1,
x = 1,
z,i,a;//undefined
//之后随意用
console.log(x);
z = 'y';//前面定义,后面再赋值
}
全局函数
'use strict'//严格检查模式
//全局变量
var x = 1;
//定义一个函数f()
function f(){
console.log(x);
}
f();//调用 f()
console.log(x);
全局对象 window
'use strict'
var x = 'xxx';
//和下面效果相同
// window.alert(x);
// window.alert(window.x);
alert(x);
alert(window.x);//默认所有的全局变量都会自动绑定在 window 下
alert () 这个函数本身也是一个 window 的变量
'use strict'
var x = 'xxx';
window.alert(x);
//将变量整体赋值给一个新的
var old_alert = window.alert;
//old_alert(x);
window.alert = function (){
}
//此时我们手动定义了一个全局变量,使其失效了
window.alert(123);
//恢复
window.alert = old_alert;
window.alert(123);
Javascript 实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,就会报错:RefrenceError
规范
由于我们所有的全局变量都会绑定到我们的 window 上。如果不同的js文件,使用了相同的全局变量,冲突的话怎么去解决,又如何减少冲突呢?
'use strict'
//定义一个唯一的全局变量
var lina = {};
//定义全局变量
lina.name = 'zenglina';
lina.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 出了这个作用域,依然可以使用
}
aaa();
**ES6 引出了一个 let 关键字,解决局部作用域冲突问题 **
function aaa(){
for (let i = 0; i < 100; i++) {
console.log(i)
}
console.log(i+1);//Uncaught ReferenceError: i is not defined
}
aaa();
建议大家都使用 let 去定义局部作用域变量;
常量
在ES6之前,定义常量方式:只要我们用全部大写字母命名的变量,就是常量。建议不要修改这样的值
'use strict'
//只要我们用全部大写字母命名的变量,就是常量。
// 建议不要修改这样的值,属于一个约定
var PI = '3.14';
console.log(PI);
PI = '231';//这边是可以改变的
console.log(PI);
在ES6引入了常量关键字 const
'use strict'
const PI = '3.14';//只读变量
console.log(PI)
PI = '123';//报错提示,这是个只读变量,不能改变