javascript函数,构造函数。js对象和json的区别。js中this指向问题


函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。
好处:在出现大量程序相同的时候,可以封装为一个function,这样只用调用一次,就能执行很多语句。
(1)语法:
函数就是包裹在花括号中的代码块,前面使用了关键词 function:
eg:
function myFunction(){
  //执行的代码
}
//调用。
myFunction();
<button onclick="myFunction()">点击</button>
(2)参数
function小括号中的参数,叫形式参数(形参);调用时传的数值,叫做实际参数(实参)。
变量和参数必须以一致的顺序出现。
eg:
function myFunction(a,b){
  console.log(a+b);
}
myFunction(1,2);
//3
(3)返回值return
函数只能有唯一的return,有if语句除外。
使用 return 语句时,函数会停止执行,并返回指定的值。
function myFunction(){
  var x=5;
  return x;
  x=7;
}
myFunction()
//5
var myVar=myFunction();
myVar 值是 5,也就是函数 "myFunction()" 所返回的值。
希望退出函数时 ,使用 return 语句。
var x=10;
function myFunction(a,b){
  if (a>b){
    return;
  }
  x=a+b
  return x;
}
myFunction(2,1);
//undefined
myFunction(2,3);
//5
(4)函数表达式
定义函数,还有一种方法,就是函数表达式。
eg:
function myFunction(){
}
var myFunctionval = function(){
}
函数没有名字,叫匿名函数
var myFunctionval = function(a,b){
  return a + b;
}
调用函数,直接使用myFunctionval变量来调用。
console.log(myFunctionval(1,3));
//4
(5)局部变量和全局变量
在函数内部声明的变量(使用 var)是局部变量,只能在函数内部访问它。(该变量的作用域是局部的)。
您可以在不同的函数中使用名称相同的局部变量。
eg:
function myFunction(){
  var a = 1; //局部变量
  console.log("a值" + a);
}
myFunction();
console.log("a值" + a);
//a值1
//a is not defined; 函数外面无法访问函数内部定义的a
在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它。
把值赋给尚未声明的变量,该变量将被自动作为全局变量声明。
eg:
var a = 1; //全局变量
function myFunction(){
  console.log("a值" + a);
}
myFunction();
console.log("a值" + a);
//a值1
//a值1
注意:
变量的生命期从它们被声明的时间开始。
局部变量会在函数运行以后被删除。
全局变量会在页面关闭后被删除。
(6)作用域链
子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
var a = 1;
function fn(){
  var a = 5; //同名,遮蔽效果
  console.log(a);
}
fn(); //5
console.log(a); //1

eg:
var a = 1;
var b = 2;
function outer(){
  var a = 3;
  function inner(){
    var b = 4;
    console.log(a); //找上一层找到3
    console.log(b); //局部4
  }
  inner();
  console.log(a); //本层函数内 3
  console.log(b); //本层无,找到外部全局的2
}
outer();
console.log(a); //只能找全局的 1
console.log(b); //只能找全局的 2
//3
//4
//3
//2
//1
//2
(7)函数声明的提升
JS在执行前,会有一个预解析的过程,把所有的函数声明,都提升到了最最开头,然后再执行第一行语句。
函数声明会被提升,但是函数表达式却不会被提升
eg:
myFunction();
var myFunctionval = function(){
  console.log("1");
}
//myFunction is not defined(…)
myFunction();
function myFunction(){
  console.log("1");
}
//1。
注意
foo这个标识符冲突了,一个函数叫做foo,一个变量也叫作foo。预解析阶段,如果遇见标识符冲突,函数优先。
foo();
var foo;
function foo(){
console.log("1");
}
foo = function(){
console.log("2");
}
//1
eg:
var myFunction = 1;
function myFunction(){
alert("我是函数");
}
myFunction();
//myFunction is not a function(…)
预解析的时候 myFunction是个函数。当执行到 var myFunction=1;的时候时。 myFunction=1; myFunction()的时候。会报错
eg:
myFunction();
var myFunction = 1;
var myFunction= function(){
alert("我是函数");
}
// myFunction is not a function(…);
函数声明提升的时候,函数表达式不会被提升。预解析的时候myFunction是1. myFunction()的时候。会报错
(8)函数是一个引用类型 typeof(function)
基本类型:number、string、boolean、undefined、null
引用类型:object、function、array、RegExp、Math、Date。
基本类型保存值,引用类型保存地址
var a = 1;
var b = a;
b = 3; //更改了b的值,a不受影响
console.log(a);
//1
eg:
var a = function(){
  alert("我是一个函数");
}
var b = a; //把匿名函数的地址也给了b
b.abc = 1;
//输出a的haha属性,你会发现a也有这个属性也改变了 //b的abc属性和a的同步变化,都是指向的同一个对象
console.log(a.abc);
// 1

构造函数:
new是是一个操作符,使用new操作符调用函数的时候,此时将会发生4个事情:
(1)创建一个空对象
(2)把函数内部的this指向这个空对象
(3)将顺序函数执行里面的语句
(4)返回这个对象
function fun(){
name : "小花" ,
age : 18 ,
sex : "女",
}
var xiaoming = new fun();
console.log(xiaoming);
//fun {name: "小花", age: 18, sex: "女"}
javascript基础之对象
对象只是带有属性和方法的特殊数据类型
javaScript 有内置对象比如 String、Date、Array 等等。
1:用字面量的方式创建,使用{}当做界定符号,里面用k-v对儿罗列所有属性
var obj = {
name : "小花" ,
age : 18 ,
sex : "女",
sayHello : function(){
console.log("我是" + this.name);
}
}
对象就是属性的无序集合
2:访问对象的属性
objectName.propertyName
objectName["propertyName"]
访问对象的方法
objectName.methodName()
var obj = {
name : "小花" ,
age : 18 ,
sex : "女",
sayHello : function(){
console.log("我是" + this.name);
}
}
console.log(obj.name);
console.log(obj['name']);
console.log(obj.sayHello);
console.log(obj['sayHello']);
console.log(obj.sayHello());
//小花
//小花
//函数
//函数
//我是小花
3:对象的字面量和JSON的关系
JSON没有声明变量这一说(JSON中没有变量的概念)
JSON末尾没有分号{}后面
JSON要求所有的键必须有双引号(单引号不行),而对象字面量不要求(当键的名字不符合标识符名字的时候必须加上双引号,英语字母、数字、_、$ ,不以数字开头)。
4:this指向问题
关键字
指向的是调用函数的那个对象
和调用有关和定义无关
(1)当用()调用的时候,指向的是window
function myfunction(){
console.log(this);
}
myfunction();
//Window {external: Object, chrome: Object, document: document, _ASYNC_START: 1500782356654, _chrome_37_fix: undefined…}
(2)dom元素事件处理程序的时候,指向的是dom对象
function myfunction(){
console.log(this);
}
div.onclick=myfunction;
//div
(3)当函数被setInterval、setTimeout调用的时候,函数里面的this是window对象
setInterval(myfunction,2000);
(4)当函数被当做某个对象属性被调用的时候,此时这个函数里面的this指的是这个对象
var obj = {
name : "小花" ,
age : 18 ,
sex : "女",
sayHello : function(){
console.log("我是" + this.name);
}
}
obj.sayHello();
(5)call和apply方法可以任意设置函数里面的this
函数.call(对象);
函数.apply(对象);
函数立即执行,且函数内部的this指向对象。
区别是传参:
sum.call(obj,1,2,3); // call必须要用逗号罗列所有参数
sum.apply(obj , [1,2,3]); // apply用数组罗列所有参数
(6)new 调用的函数。
this指的是系统内部创建的新对象

原文地址:https://www.cnblogs.com/kelly2017/p/7188632.html