成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JS傳參技巧總結(jié)

wangshijun / 3534人閱讀

1.隱式創(chuàng)建 html 標(biāo)簽
這種方法一般配合 ajax,上面的 value 使用了模板引擎
2.window["data"]
window["name"] = "the window object";
3.使用 localStorage,cookie 等存儲
window.localStorage.setItem("name", "xiaoyueyue");
window.localStorage.getItem("name");
特點:cookie,localStorage,sessionStorage,indexDB
特性 cookie localStorage sessionStorage indexDB
數(shù)據(jù)生命周期 一般由服務(wù)器生成,可以設(shè)置過期時間 除非被清理,否則一直存在 頁面關(guān)閉就清理 除非被清理,否則一直存在
數(shù)據(jù)存儲大小 4K 5M 5M 無限
與服務(wù)端通信 每次都會攜帶在 header 中,對于請求性能影響 不參與 不參與 不參與

從上表可以看到,cookie 已經(jīng)不建議用于存儲。如果沒有大量數(shù)據(jù)存儲需求的話,可以使用 localStoragesessionStorage 。對于不怎么改變的數(shù)據(jù)盡量使用 localStorage 存儲,否則可以用 sessionStorage 存儲。

注意點:存儲object類型數(shù)據(jù),此深拷貝方法會忽略掉函數(shù)和 undefined
var obj = {
  type: undefined,
  text: "xiaoyueyue",
  methord: function() {
    alert("I am an methord");
  }
};

localStorage.setItem("data", JSON.stringify(obj));
console.log(JSON.parse(localStorage.getItem("data"))); // {text: "xiaoyueyue"}
4.獲取地址欄方法

自己封裝的方法

function parseParam(url) {
  var paramArr = decodeURI(url)
      .split("?")[1]
      .split("&"),
    obj = {};
  for (var i = 0; i < paramArr.length; i++) {
    var item = paramArr[i];
    if (item.indexOf("=") != -1) {
      var tmp = item.split("=");
      obj[tmp[0]] = tmp[1];
    } else {
      obj[item] = true;
    }
  }
  return obj;
}

2.正則表達(dá)式方法

function GetQueryString(name) {
  var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
  var r = window.location.search.substr(1).match(reg);
  if (r != null) return unescape(r[2]);
  return null;
}
5.標(biāo)簽綁定函數(shù)傳參




this 拓展

使用 this 傳參,在使用 art-template 中琢磨出來的,再也不用只傳遞一個 id 拼接成好幾個參數(shù)了!happy!

var box = document.createElement("div");
box.innerHTML =
  "";
document.body.appendChild(box);

// name,age,friend
function alertInfo(data) {
  alert(
    "大家好,我是" +
      data.name +
      ", 我今年" +
      data.age +
      "歲了,我的好朋友是" +
      data.friend +
      " !"
  );
}
這里需要注意一點:存儲的 data—含有大寫的單詞 =》這里會統(tǒng)一轉(zhuǎn)化為小寫,比如:data-orderId = “2a34fb64a13211e8a0f00050568b2fdd”,在實際取值的時候為this.dataset.orderid;
event

既然可以使用 this,那么在事件當(dāng)中event.target方法也是可以的:

根據(jù) class 獲取當(dāng)前的索引值,參數(shù)可以為 event 對象
  var getIndexByClass =  function (param) {
    var element = param.classname ? param : param.target;
    var className = element.classname;
    var domArr = Array.prototype.slice.call(document.querySelectorAll("." + className));
    for (var index = 0; index < domArr.length; index++) {
      if (domArr[index] === element) {
        return index;
      }
    }
    return -1;
  },
6.HTML5 data-* 自定義屬性
var btn = document.querySelector("button");
btn.onclick = function() {
  alert(this.dataset.name);
};
7.字符串傳參 單個參數(shù)
var name = "xiaoyueyue",
  age = 25;

var box = document.createElement("div");
box.innerHTML = "";
document.body.appendChild(box);

// name, age
function alertInfo(name, age, home, friend) {
  alert("我是" + name);
}
多參傳遞
  var name = "xiaoyueyue",
      age = "25",
      home = "shanxi",
      friend = "heizi",
      DQ = """; // 雙引號的超文本標(biāo)記語言

    var params = """ + name + "","" + age + "","" + home + "","" + friend + """;
    var params2 = DQ + name + DQ + "," + DQ + age + DQ + "," + DQ + home + DQ + "," + DQ + friend + DQ;
    var box = document.createElement("div");
    box.innerHTML = "";
    console.log(box)
    document.body.appendChild(box);


    // name, age,home,friend
    function alertInfo(name, age, home, friend) {
      alert("我是" + name + "," + "我今年" + age + "歲了!")
復(fù)雜傳參
var data = [
  {
    name: "xiaoyueyue",
    age: "25",
    home: "shanxi",
    friend: "heizi"
  }
];

var box = document.createElement("div"),
  html = "";

for (var i = 0; i < data.length; i++) {
  html +=
    "";
}
box.innerHTML = html;
document.body.appendChild(box);

function alertInfo(id, name, age, home, friend) {
  alert("我是 " + name + " , " + friend + " 是我的好朋友");
}
8.arguments

arguments對象是所有(非箭頭)函數(shù)中都可用的局部變量。你可以使用 arguments 對象在函數(shù)中引用函數(shù)的參數(shù)。它是一個類數(shù)組的對象。

function fenpei() {
  var args = Array.prototype.slice.call(arguments);
  alert("我是" + args[2] + "油品,數(shù)量為 " + args[1] + " 噸, id為 " + args[0]);
}
9.form 表單

借助form表單,ajax 傳遞序列化參數(shù)

// form表單序列化,摘自JS高程
function serialize(form) {
  var parts = [],
    field = null,
    i,
    len,
    j,
    optLen,
    option,
    optValue;

  for (i = 0, len = form.elements.length; i < len; i++) {
    field = form.elements[i];

    switch (field.type) {
      case "select-one":
      case "select-multiple":
        if (field.name.length) {
          for (j = 0, optLen = field.options.length; j < optLen; j++) {
            option = field.options[j];
            if (option.selected) {
              optValue = "";
              if (option.hasAttribute) {
                optValue = option.hasAttribute("value")
                  ? option.value
                  : option.text;
              } else {
                optValue = option.attributes["value"].specified
                  ? option.value
                  : option.text;
              }
              parts.push(
                encodeURIComponent(field.name) +
                  "=" +
                  encodeURIComponent(optValue)
              );
            }
          }
        }
        break;

      case undefined: //fieldset
      case "file": //file input
      case "submit": //submit button
      case "reset": //reset button
      case "button": //custom button
        break;

      case "radio": //radio button
      case "checkbox": //checkbox
        if (!field.checked) {
          break;
        }
      /* falls through */

      default:
        //don"t include form fields without names
        if (field.name.length) {
          parts.push(
            encodeURIComponent(field.name) +
              "=" +
              encodeURIComponent(field.value)
          );
        }
    }
  }
  return parts.join("&");
}

栗子:

document.querySelector("button").onclick = function() {
  console.log("param: " + serialize(document.getElementById("formData"))); // param: ordersaleCode=&extractType=0
};
10. 發(fā)布訂閱處理復(fù)雜邏輯傳參
支持先訂閱后發(fā)布,以及先發(fā)布后訂閱

方法源碼

var Event = (function() {
  var clientList = {},
    pub,
    sub,
    remove;

  var cached = {};

  sub = function(key, fn) {
    if (!clientList[key]) {
      clientList[key] = [];
    }
    // 使用緩存執(zhí)行的訂閱不用多次調(diào)用執(zhí)行
    cached[key + "time"] == undefined ? clientList[key].push(fn) : "";
    if (cached[key] instanceof Array && cached[key].length > 0) {
      //說明有緩存的 可以執(zhí)行
      fn.apply(null, cached[key]);
      cached[key + "time"] = 1;
    }
  };
  pub = function() {
    var key = Array.prototype.shift.call(arguments),
      fns = clientList[key];
    if (!fns || fns.length === 0) {
      //初始默認(rèn)緩存
      cached[key] = Array.prototype.slice.call(arguments, 0);
      return false;
    }

    for (var i = 0, fn; (fn = fns[i++]); ) {
      // 再次發(fā)布更新緩存中的 data 參數(shù)
      cached[key + "time"] != undefined
        ? (cached[key] = Array.prototype.slice.call(arguments, 0))
        : "";
      fn.apply(this, arguments);
    }
  };
  remove = function(key, fn) {
    var fns = clientList[key];
    // 緩存訂閱一并刪除
    var cachedFn = cached[key];
    if (!fns && !cachedFn) {
      return false;
    }
    if (!fn) {
      fns && (fns.length = 0);
      cachedFn && (cachedFn.length = 0);
    } else {
      if (cachedFn) {
        for (var m = cachedFn.length - 1; m >= 0; m--) {
          var _fn_temp = cachedFn[m];
          if (_fn_temp === fn) {
            cachedFn.splice(m, 1);
          }
        }
      }
      for (var n = fns.length - 1; n >= 0; n--) {
        var _fn = fns[n];
        if (_fn === fn) {
          fns.splice(n, 1);
        }
      }
    }
  };
  return {
    pub: pub,
    sub: sub,
    remove: remove
  };
})();

在微信小程序中使用的例子:

全局掛載使用

// app.js
App({
  onLaunch: function(e) {
    // 注冊 storage,這是第二條
    wx.Storage = Storage;
    // 注冊發(fā)布訂閱模式
    wx.yue = Event;
  }
});

使用實例

// 添加收貨地址頁面訂閱
 onLoad: function (options) {
        wx.yue.sub("addAddress", function (data) {
            y.setData({
                addAddress: data
            })
        })
 }
/**
 * 生命周期函數(shù)--監(jiān)聽頁面隱藏
 */
 onHide: function () {
    // 取消多余的事件訂閱
    wx.Storage.removeItem("addAddress");
},
 onUnload: function () {
    // 取消多余的事件訂閱
    wx.yue.remove("addAddress");
}
// 傳遞地址頁面獲取好數(shù)據(jù)傳遞
wx.yue.pub("addAddress", data.info);
// 補(bǔ)充跳轉(zhuǎn)返回
注意:使用完成數(shù)據(jù)后要注意卸載,在頁面被關(guān)閉時操作
拓展閱讀

JavaScript 參數(shù)傳遞的深入理解

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/108147.html

相關(guān)文章

  • JavaScript 函數(shù)式編程技巧 - 反柯里化

    摘要:作為函數(shù)式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。而反柯里化,從字面講,意義和用法跟函數(shù)柯里化相比正好相反,擴(kuò)大適用范圍,創(chuàng)建一個應(yīng)用范圍更廣的函數(shù)。作為函數(shù)式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 可以對照另外一篇介紹 JS 柯里化 的文章一起看~ 1. 簡介 柯里化,是固定部分參數(shù),返回一個接受剩余參數(shù)的函數(shù),也稱為部分計算函數(shù),目的是為了縮...

    zhjx922 評論0 收藏0
  • 7個javascript實用小技巧

    摘要:每種編程語言都有一些黑魔法或者說小技巧,也不例外,大部分是借助或者瀏覽器新特性實現(xiàn)。下面介紹的個實用小技巧,相信其中有些你一定用過。當(dāng)然不管語言如何變化,我們總能在編程中總結(jié)一些小技巧來精簡代碼。 showImg(https://segmentfault.com/img/remote/1460000018902642); 每種編程語言都有一些黑魔法或者說小技巧,JS也不例外,大部分是借...

    tinysun1234 評論0 收藏0
  • JavaScript如何工作:V8引擎深入探究 + 優(yōu)化代碼的5個技巧(譯文)

    摘要:引擎可以是一個標(biāo)準(zhǔn)的解釋器,也可以是一個將編譯成某種形式的字節(jié)碼的即時編譯器。和其他引擎最主要的差別在于,不會生成任何字節(jié)碼或是中間代碼。不使用中間字節(jié)碼的表示方式,就沒有必要用解釋器了。 原文地址:https://blog.sessionstack.com... showImg(https://segmentfault.com/img/bVVwZ8?w=395&h=395); 數(shù)周之...

    William_Sang 評論0 收藏0
  • JavaScript 實戰(zhàn)開發(fā)經(jīng)驗!函數(shù)多參數(shù)傳參技巧

    摘要:學(xué)堂碼匠掌握代碼的你,一定編寫封裝過函數(shù),為了提升函數(shù)的控制性,必不可少的就是參數(shù),必選可選的一大堆參數(shù)羅列出來,函數(shù)調(diào)用貌似變得麻煩起來必選參數(shù)指的是必須要傳入實參的參數(shù)可選參數(shù)在函數(shù)中有默認(rèn)值,如有傳入實參,則取實參的值,如果沒有傳入 HTML5學(xué)堂-碼匠:掌握J(rèn)avaScript代碼的你,一定編寫封裝過函數(shù),為了提升函數(shù)的控制性,必不可少的就是參數(shù),必選可選的一大堆參數(shù)羅列出來,...

    wing324 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<