文章目录
一、IIFE立即执行函数
普通函数:
<script>
// 先声明
function fn(){
console.log("fn...");
}
// 后调用
fn()
</script>
立即执行函数:
<script>
//如果这样直接调用会报错 SyntaxError: Unexpected token ')'
// function gn(){
// console.log("gn...");
// }()
// IIFE 的写法:
(function kn(){
console.log("kn...");
}())
// // IIFE
// +function kn(){
// console.log("kn...");
// }()
// IIFE
// -function kn(){
// console.log("kn...");
// }()
// !function kn(){
// console.log("kn...");
// }()
// IIFE
// (function mn(){
// console.log("mn...");
// })()
// 普通的对象
let obj = {
name:"wc",
age:100
}
// IIFE
;(function mn(){
console.log("mn...");
})()
// 输出普通对象
console.log(obj);
</script>
二、this
- (1)如果this出现在一普通的函数中,通过window.f调用此函数,那么里面的this就表示window。就看.前面是谁,那么this就表示谁 window.f() f中的this就表示window
- (2)事件绑定中 监听器中的this表示事件源
- (3)对象是属性的无序集合 在一个对象中也可以能函数 如果一个函数出现在对象中 这个函数叫方法。通过对象打点调用了方法,那么这个方法中的this表示这个对象 就看.前面是谁,那么this就表示谁。
- (4)在IIFE(立即执行函数)中,this表示window
- (5)在严格模式和非严格模式下,this代表的含义是不一样的 严格模式后面说
- (6)一片代码中有this,谁也不知道this代表什么含义,只能代码执行起来后,才知道this表示什么。
三、this练习题
1.this出现在普通函数中
<script>
// this出现在普通的函数中
function fn() {
// 此时this表示window
console.log(this)
}
fn()
window.fn()
</script>
2.this出现在监听器中
<button onclick="fn">登录</button>
<script>
let btn = document.getElementsByTagName("button")[0]
btn.onclick = function(){
// 在监听器中,this表示事件源
console.log(this)
}
</script>
3.this出现在方法中
<script>
let obj = {
name: "wangcai",
age: 100,
// this出现在方法中
// run叫方法 函数
run: function () {
// this表示当前的对象
// this代表是谁,你就看.前面是谁,
// this代表什么谁,只有去调用此方法时,才知道this是谁
console.log(this)
console.log("run....")
}
}
// .前面是obj,代表this是obj
obj.run()
</script>
4.this出现在IIFE函数中
<script>
; (function f() {
console.log(this);
}())
</script>
5.关于this的其他练习题
(1)
<button id="box">点击</button>
<script>
let btn = document.getElementById("box");
function f() {
console.log(this); // window
// return undefined
}
// f() 表示函数的返回值
btn.onclick = f();
</script>
(2)
<button id="box">点击</button>
<script>
let btn = document.getElementById("box");
function f() {
return function () {
console.log(this)
}
}
btn.onclick = f();
</script>
(3)
<script>
// this出现在普通的函数,this表示window
function qq() {
console.log(this);
}
window.qq();
qq();
</script>
(4)
<script>
let wc = {
name: "wangcai",
age: 100,
// this出现在方法中,就看谁调用了这个方法
eat: function () {
console.log("eat...")
console.log(this);
}
}
wc.eat();
</script>
(5)
<script>
let wc = {
name: "wangcai",
age: 100,
eat: function () {
console.log("eat...")
// this是谁,不调用,谁也不知道
console.log(this);
}
}
let mm = wc.eat;
mm();
</script>
(6)
<script>
// num也在GO中,此num已变成了60 num又变成了65
var num = 10;
var obj = {
num: 20
}
obj.fn = (function (num) { // 形参num 值是20
// this.num = 60
// IIFE中的this表示window
this.num = num * 3; // GO中的num变成了60
// num++ 让num的值加1 21
num++;
// log(num) 21
console.log(num);
return function (n) { // n是5
// this.num = this.num + n;
this.num += n;
// 父函数的EC中的num变成了22
num++;
console.log(num)
}
})(obj.num); // obj.num是20
var fn = obj.fn;
//
fn(5)
console.log(window.num);
// ==> 21 ==>22 ==>65
</script>
(7)
<script>
// num变成了60
var num = 10;
var obj = {
// num变成了30
num: 20
} // ===> 21 ===> 22 ==> 60 ==> 60 ==> 30
obj.fn = (function (num) { // num是20
// this是window 让GO中的num变成了60
this.num = num * 3;
// AO中的num变成了21
num++;
// 输出num 21 num变成了22
console.log(num);
return function (n) { // n是10
// this.num = this.num + n; this是obj
this.num += n;
num++; // 找num
console.log(num) // 找num 22
}
})(obj.num);
obj.fn(10);
console.log(num)
console.log(window.num)
console.log(obj.num)
</script>
(8)
<script>
(function () {
// AO中放了一个a值是1 a变成了2
var a = 1;
var obj = {
// 要找这个10只能obj.a
a: 10,
f: function () {
// a = a*2
a *= 2;
}
}
obj.f()
alert(obj.a + a);
})()
</script>
(9)
<script>
(function () {
var a = 1;
var obj = {
a: 10,
f: function () {
this.a *= 2;
console.log(this.a)
}
}
obj.f()
})()
</script>
(10)
<script>
var name = "window";
var Wangcai = {
name: "Wangcai",
show: function () {
// this是谁 看谁调用了此函数window调用了
// this表示window
console.log(this.name);
},
f: function () {
// this.show this是Wangcai 找show
var fun = this.show;
//
fun();
}
}
Wangcai.f();
</script>
(11)
<script>
var fullname = "language";
var obj = {
fullname: "javascript",
props: {
getFullName: function () {
// 找this this是obj.props
// this.name就是this.props.name
// 访问一个对象上不存在的属性,结果是und
return this.name;
}
}
}
console.log(obj.props.getFullName());
</script>
(12)
<script>
var fullname = "language";
var obj = {
fullname: "javascript",
props: {
fullname: "hello",
getFullName: function () {
return this.fullname;
}
}
}
console.log(obj.props.getFullName());
</script>
(13)
<script>
var fullname = "language";
var obj = {
fullname: "javascript",
props: {
fullname: "hello",
getFullName: function () {
// windwo调用了此函数 this表示window
return this.fullname;
}
}
}
let qq = obj.props.getFullName;
console.log(qq());
</script>
(14)
<script>
let obj = {
fn: (function () {
console.log(this); // window
return function () {
console.log(this); // obj
}
})()
}
obj.fn();
</script>
(15)
<script>
let obj = {
fn: (function () {
console.log(this)
return function () {
console.log(this)
}
})()
}
let qq = obj.fn;
qq();
</script>